Создать наблюдателя событий для фокуса?

Возможно ли, что пузырь пузырьков фокусировки в протойпе?

Я пытаюсь запретить назначать наблюдателя для каждого элемента ввода.

<script language="javascript" type="text/javascript">
document.observe('dom:loaded', function() {

    // Doesn't work
    $('editForm').observe('focus', function(evnt){
        console.log('FOCUS!');
    });

    // Works
    $('editForm').select('INPUT').each(function(elem) {
        elem.observe('focus', function(evnt){
            console.log('FOCUS!');
        });
    });

}); 
</script>

<form method="post" name="editForm" id="editForm" action="">
<input type="text" name="foobar" />
</form>

Ответ 1

события фокуса и размытия не пузырятся.

Вы можете запустить обработчик событий во время фазы захвата. При использовании стандартных методов DOM вы должны написать

document.addEventListener('focus',function(e){/*some code */}, true);

здесь самое важное значение "true".

Проблема заключается в том, что IE не поддерживает захват фазы распространения события, но для IE вы можете использовать события focusin и focusout, которые, в отличие от фокусов и размытых событий, пузырьки. Я рекомендую прочитать статью по этой теме, написанную Питером Полом Кохом. Другие браузеры (Firefox, Opera, Safari), вероятно, (я не тестировал) поддерживают такие события, как DOMFocusIn, DOMFocusOut, которые являются эквивалентами для событий IE focusin и focusout.

Ответ 2

Вы можете использовать это:

function focusInHandler(event){
    Event.element(event).fire("focus:in");
}
function focusOutHandler(event){
    Event.element(event).fire("focus:out");
}

if (document.addEventListener){
    document.addEventListener("focus", focusInHandler, true);
    document.addEventListener("blur", focusOutHandler, true);
} else {
    document.observe("focusin", focusInHandler);
    document.observe("focusout", focusOutHandler);
}

document.observe('focus:in', function(event) {
    // Your code
});

My jsFiddle: http://jsfiddle.net/EpokK/k7RPE/3/