jQuery: живые события и запросы, будет ли элемент отвечать на событие - PullRequest
5 голосов
/ 23 декабря 2010

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

HTML

<div id="foo">Click me!</div>

JS

$('#foo').live('mousedown', function() {
  console.log('triggered mousedown event');
}

if ($('#foo').__willRespondToLiveEvent__('mousedown')) {
  console.log('#foo is wired up properly');
}

Это несколько простой и надуманный пример, но я ищу замену, которая действительно работает для __willRespondToLiveEvent__ кода псевдо.

Есть ли в любом случае jQuery для обработки этой информации без фактического вызова события?

Ответы [ 2 ]

6 голосов
/ 23 декабря 2010

Если вам нужна утилита, в которую вы можете передать селектор, вы можете сделать это:

Пример: http://jsfiddle.net/NMBsG/3/

$('#foo').live('click', function() {
    alert('hi');
});

(function($) {
    $.hasLive = function(sel, type) {
        var data = $.data(document);
        if (data && data.events && data.events[type]) {
            var evts = data.events[type];
            for (var i = 0, len = evts.length; i < len; i++) {
                if (evts[i].selector === sel) {
                    return true;
                }
            }
        }
        return false;
    };
})(jQuery);

alert($.hasLive('#foo', 'click'));

Или, если вы хотите вызвать его для объекта jQuery, вы можете сделать это:

Пример: http://jsfiddle.net/NMBsG/4/

$('#foo').live('click', function() {
    alert('hi');
});

(function($) {
    $.fn.hasLive = function(type) {
        var data = $.data(document);
        if (data && data.events && data.events[type]) {
            var evts = data.events[type];
            for (var i = 0, len = evts.length; i < len; i++) {
                if (evts[i].selector === this.selector) {
                    return true;
                }
            }
        }
        return false;
    };
})(jQuery);

alert($('#foo').hasLive('click'));

Обратите внимание, что оба они проверяют только селектор, поскольку именно так работает .live(). Вы можете реально выбрать тот же элемент, но с использованием другого подходящего селектора, и он вернет false. Таким образом, селектор должен соответствовать точно .


EDIT:

Вот модифицированная версия, которая использует .is() для проверки объекта jQuery с селекторами, которые были присвоены .live() для предоставленного типа события. Пока один элемент в объекте соответствует обработчику .live() для этого события, он должен возвращать true.

Пример: http://jsfiddle.net/NMBsG/5/

var test = $('#foo').live('click', function() {
    alert('hi');
});

(function($) {
    $.fn.hasLive = function(type) {
        var data = $.data(document);
        if (data && data.events && data.events[type]) {
            var evts = data.events[type];
            for (var i = 0, len = evts.length; i < len; i++) {
                if ( this.is(evts[i].selector) ) {
                    return true;
                }
            }
        }
        return false;
    };
})(jQuery);

alert($('#foo').hasLive('click'));

РЕДАКТИРОВАТЬ: Исправлен сбой, когда не назначено .live() событий, благодаря @Gaby.

0 голосов
/ 23 декабря 2010

Забудь мой ответ .. пропустил live часть вопроса ..

проверить ответ Патрика

var events = $('#foo').data('events');
if (events)
{
    for (var event in  events)
        console.log('#foois wired up for the "'+event+'" event');
}

это напечатает все событие, которое #foo установлено для обработки через jQUery.

Для использования в if

var events = $('#foo').data('events');
if (events && events['click'])
  {
    console.log('#foo is wired up properly');
  }

...