Как сделать живые пользовательские события в jQuery - PullRequest
6 голосов
/ 03 мая 2009

jQuery имеет действительно удобный механизм привязки событий, называемый live (), который будет добавлять события к элементам DOM на лету (даже для элементов, которые будут добавлены позже в DOM). Проблема в том, что он работает только с конкретными событиями (, перечисленными здесь в документации ).

Я действительно хочу иметь живые события для фокусировки, размытия и изменения, которые сейчас не поддерживаются живыми. Кроме того, если я смогу делать живые пользовательские события, это станет большим изменением игры для моего приложения. Большая часть кода, который у меня есть сейчас, посвящена привязке старых событий (изменение, фокус и пользовательские события для перетаскивания или изменения размера элементов) к новым элементам dom, добавленным через ajax.

Есть идеи? Я думаю, что делегирование событий - это путь, но сейчас я усложню код. Может быть плагин, который обрабатывает делегирование событий ... не уверен. Помогите мне найти решение.

Ответы [ 5 ]

5 голосов
/ 19 января 2010

Эта функциональность теперь доступна в jQuery 1.4. live() теперь поддерживает все события JavaScript (включая пользовательские события), а события focusin и focusout представлены в виде всплывающих версий focus и blur.

.

Из документации jQuery 1.4 по .live () :

Начиная с jQuery 1.4, метод .live () поддерживает пользовательские события, а также все события JavaScript. Два исключения: поскольку фокус и размытие на самом деле не являются пузырящимися событиями, вместо этого нам нужно использовать focusin и focusout.

5 голосов
/ 03 мая 2009

Если его нет в jQuery, скорее всего, есть причина. Ошибки браузера и т.д., которые делают его ненадежным. Я бы подождал, пока они его не реализовали, или попробовал бы использовать оригинальный плагин, который стал живым http://docs.jquery.com/Plugins/livequery

Edit:

Хорошие парни из нижнего голосования. Есть причина, по которой его нет в jQuery, и я сильно сомневаюсь, что это потому, что они ленивые . На самом деле я потратил время на чтение исходного кода и поиск, почему в live () реализованы только определенные события, и я не могу найти почему. Так что, если кто-то знает ... пожалуйста, просветите нас.

4 голосов
/ 03 мая 2009

Метод 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, он не будет работать.

1 голос
/ 05 октября 2009

Возможно, вы захотите проверить плагин Ариэля Флезли jQuery.Listen. Он похож на события live () и плагин livequery (), но поддерживает события focus () и blur ().

http://flesler.blogspot.com/2007/10/jquerylisten.html

0 голосов
/ 03 мая 2009

Я успешно использовал плагин livequery в качестве дополнения к функции .live () в jQuery. Он не только может связывать события, такие как фокус, размытие и изменение (которые live () еще не поддерживает, начиная с 1.3.2), но также предоставляет механизм привязки пользовательских событий к элементам DOM на лету. Например, я использовал его для привязки draggable и droppables к некоторым элементам DOM, которые будут добавлены через Ajax. Это делает мой код намного проще для чтения и поддержки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...