Компоненты, расширяющие функциональность HTML кода :)
От: ЖуК Украина http://smart-ip.net/
Дата: 21.12.03 14:51
Оценка: 66 (8) :)
Приняв во внимание все пожелания и полезные сведения, попытаемся решить задачу
Автор: 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+ (будем надеятся ), нам необходимо:

  1. Включить в страницу следующий код
    <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="needed_value_for_input_text.js"></SCRIPT>

  2. Определить аттрибуты neededValue у тэгов <Input type="text">, например:
    <INPUT TYPE="text" neededValue="blablabla">

Всё! Больше ничего не нужно — теперь те элементы input, которые имеют аттрибут neededValue будут держать у себя фокус до тех пор, пока не будет введено необходимое значение. А те элементы, для которых аттибут neededValue не определен... ну что же — они так и остануться обычными инпутами... но ведь это и правильно!

З.Ы. Ребятки, вы чувствуете всю мощь и красоту подобного подхода при написании ДХТМЛ? Да ведь я просто могу, блин, в штимеле написать, например:
<DIV special="editor"></div>

и вынести реализацию WYSIWYG редактора хрен знает куда, причем сделать их 200 штук на один ШТМЛ-шаблон!

Или просто писать таким образом различные компоненты, РАСШИРЯЮЩИЕ ФУНКЦИОНАЛЬНОСТЬ ШТМЛ, и в будущем свести большинство задач по клиентскому программированию к обычной HTML верстке ...

Вопрос — почему же до сих пор мы так не делали? Или кто-то уже так делал? Поделитесь опытом...

З.З.Ы. Специально хочу сказать спасибо uzzy за задачу, и marx paul за идею с аттрибутами.
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.