Създаване на наблюдател на събитие за фокус?

Възможно ли е балонът на фокусните събития в прототипа?

Опитвам се да предотвратя необходимостта да назначавам наблюдател на всеки входен елемент.

<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>

person Louis W    schedule 21.05.2009    source източник


Отговори (2)


събитията за фокусиране и замъгляване не се появяват в балончета.

Можете да задействате манипулатор на събития по време на фазата на заснемане. Когато използвате стандартни DOM методи, бихте написали

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

„истинската“ стойност тук е най-важна.

Проблемът е, че IE не поддържа фаза на улавяне на разпространение на събитие, но за IE можете да използвате събития focusin и focusout, които - за разлика от събитията focus и blur - правят балончета. Препоръчвам да прочетете статия по тази тема, написана от Peter Paul Koch . Други браузъри (Firefox, Opera, Safari) вероятно (не съм го тествал) поддържат събития като DOMFocusIn, DOMFocusOut, които са еквиваленти на събитията focusin и focusout на IE.

person Rafael    schedule 21.05.2009
comment
if (_is_ie) { // IE Само слушатели на събития за фокус/замъгляване f.observe('focusin', this.onFocus.bind(this)); f.observe('focusout', this.onBlur.bind(this)); } else { // Слушатели на събития за фокус/размазване на Firefox & Safari f.addEventListener('focus', this.onFocus.bind(this), true); f.addEventListener('blur', this.onBlur.bind(this), true); } След това вътре в onBlur и onFocus получавам елемента (Event.element) и проверявам дали е nodeName, за да видя дали трябва да направя нещо. - person Louis W; 21.05.2009

Можете да използвате това:

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
});

Моят jsFiddle: http://jsfiddle.net/EpokK/k7RPE/3/

person EpokK    schedule 13.05.2013