Метод jQuery live()
не будет работать, поскольку события фокуса и размытия не распространяются (всплывают), как другие события DOM. Команда jQuery в конечном итоге представит эту функциональность, но она должна быть искусственной (ручное всплытие).
Если бы я не использовал jQuery и все еще хотел воспользоваться преимуществами live()
, я бы использовал захват событий в браузерах, которые его поддерживали (большинство браузеров не в IE), а в IE я использовал бы их onFocusIn
/ onFocusOut
события (эти события, в отличие от фокуса / размытия, создают пузыри).
Вот пример:
function onFocus(el, fn) {
var outerFn = function(e) {
e = e || window.event;
if ((e.target || e.srcElement) === el) {
fn.call(el);
}
};
if (document.body.addEventListener) {
// This is event capturing:
document.body.addEventListener('focus', outerFn, true);
} else {
// This is event delegation:
document.body.attachEvent('onfocusin', outerFn);
}
return outerFn;
}
Используя его:
onFocus(document.getElementById('myInputField'), function(){
log('FOCUSED!!!');
});
Аналогичная абстракция может быть использована для размытия и изменения событий.
Подробнее о порядке событий (захват / всплытие) здесь: http://www.quirksmode.org/js/events_order.html
Также стоит отметить, что liveQuery, плагин jQuery, работает, потому что он повторно связывает событие с новыми элементами; он работает только с такими методами манипулирования DOM в jQuery, как 'append', 'insertBefore' и т. д. Поэтому, если вы добавите новый элемент без использования jQuery, он не будет работать.