Приняв во внимание все пожелания и полезные сведения, попытаемся решить
задачуАвтор: uzzy
Дата: 19.12.03
именно таким образом, чтобы в будущем можно было сказать смело: "У меня уже есть готовое решение". Заодно попробуем сделать решение максимально красивым... по возможности

, конечно же. Судите сами насколько это удалось. Итак, внимание — реализация:
файлик needed_value_for_input_text.js
var dAll = document.all;
var texts = Array();
var cnt = 0;
// Обходим все элементы страницы и находим все текстовые поля
for (var i = 0; i < dAll.length; i++) {
if( dAll[i].type == 'text') {
texts[cnt++] = i; // Создаем массив уникальных идентификаторов текстовых полей
dAll[i].uniqueId = i; // Определяем уникальный идентификатор у каждого поля
if (dAll[i].neededValue == undefined) { // если аттрибут neededValue не задан, определяем его как пустую строку.
dAll[i].neededValue = '';
}
}
}
document.focusedElement = null; // Инициализация. Фокус не принадлежит ни одному полю...
// пишем обработчики событий OnFocus и OnBlur для всех текстовых полей
for (var i = 0; i < texts.length; i++) {
// строим обработчики OnFocus
dAll[texts[i]].onfocus = function() {
// если фокус не находится ни в одном поле говорим, что фокус у данного поля :)
if (document.focusedElement == null) {
document.focusedElement = this.uniqueId;
}
// если фокус уже находится у другого поля - покидаем данное
if (document.focusedElement != this.uniqueId) {
this.blur();
}
}
// Строим обработчики OnBlur
dAll[texts[i]].onblur = function() {
// если фокус уже находится у другого поля - покидаем данное
if( document.focusedElement != this.uniqueId) {
this.blur();
} else {
// иначе смотрим введено ли нужное значение в поле
if (this.value == this.neededValue) {
this.blur(); // да введено, покидаем поле
document.focusedElement = null; // говорим, что фокуса ни у кого нет
} else {
this.focus(); // иначе возвращаем фокус "на место"
}
}
}
}
Теперь попробуем сделать выводы и принять решение, добились ли мы того чего желали, а именно, выясним — универсален ли наш код. При этом не имеется ввиду та универсальность, которая обеспечивает совместимость с браузерами от различных производителей. Нет, мы имеем ввиду универсальность несколько иного плана — сможем ли мы использовать повторно данный код в других задачах, где он может понадобиться. Для этого нужно осознать, что мы в итоге имеем. А имеем следующее...
Теперь для того, чтобы решить в будущем подобную задачу для IE 5+ (будем надеятся

), нам необходимо:
Включить в страницу следующий код
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="needed_value_for_input_text.js"></SCRIPT>
Определить аттрибуты neededValue у тэгов <Input type="text">, например:
<INPUT TYPE="text" neededValue="blablabla">
Всё! Больше ничего не нужно — теперь те элементы input, которые имеют аттрибут neededValue будут держать у себя фокус до тех пор, пока не будет введено необходимое значение. А те элементы, для которых аттибут neededValue не определен... ну что же — они так и остануться обычными инпутами...

но ведь это и правильно!
З.Ы. Ребятки, вы чувствуете всю мощь и красоту подобного подхода при написании ДХТМЛ? Да ведь я просто могу, блин, в штимеле написать, например:
<DIV special="editor"></div>
и вынести реализацию WYSIWYG редактора хрен знает куда, причем сделать их 200 штук на один ШТМЛ-шаблон!
Или просто писать таким образом различные компоненты, РАСШИРЯЮЩИЕ ФУНКЦИОНАЛЬНОСТЬ ШТМЛ, и в будущем свести большинство задач по клиентскому программированию к обычной HTML верстке

...
Вопрос — почему же до сих пор мы так не делали? Или кто-то уже так делал? Поделитесь опытом...
З.З.Ы. Специально хочу сказать спасибо uzzy за задачу, и marx paul за идею с аттрибутами.