Элементы списка с несколькими списками событий - PullRequest
1 голос
/ 22 июля 2010

Есть ли способ перечислить все элементы, которые содержат два или более события одного и того же вида?

Я поместил небольшой пример в JsBin: http://jsbin.com/alafo3/edit

В этом примере я хочу получить список, содержащий <p> с ID = "hallo2".

Ответы [ 2 ]

4 голосов
/ 22 июля 2010

Вы также можете получить доступ к клавише events прикрепленных данных, например,

$('#hello2').data('events').click.length

возвращает 2.

Обновление:

Например, вы можете расширить jQuery следующим образом:

$.fn.hasMultipleEventHandlersFor = function(event) {
    return this.filter(function() {
        var events =  $(this).data('events');
        return events && events[event] && events[event].length > 1;
    });
};

И использовать его следующим образом:

$('p').hasMultipleEventHandlersFor('click');

, который выберет все элементы, имеющие несколько обработчиков для события click.

2 голосов
/ 22 июля 2010

Вы можете перебрать объект $.cache, в котором хранятся события, например:

$.each($.cache, function(i, v) {
  if(v.events && v.events.click && v.events.click.length > 1) {
    alert($('[' + $.expando + '=' + i + ']').attr('id'));
  }
})​;

Попробуйте здесь или сделайте его более общим для любого события с несколькими обработчиками, например:

$.each($.cache, function(i, v) {
  $.each(v.events, function(j, u) {
    if(u.length > 1)
      alert($('[' + $.expando + '=' + i + ']').attr('id'));
  });
})​;

Вы можете попробовать эту версию здесь , обратите внимание, что для обоих этих подходов требуется jQuery 1.4+, свойство expando не доступно в 1.3.x.


Если вы хотите, чтобы коллекция jQuery ссылалась на эти элементы, вы можете создать ее по ходу, например:

var elems = [];
$.each($.cache, function(i, v) {
  $.each(v.events, function(j, u) {
    if(u.length > 1)
      $.merge(elems, $('[' + $.expando + '=' + i + ']'));
  });
});
​$(elems).css('color', 'red');​​​​ //use it, $(DOMElementArray) overload here

Вы можете проверить эту версию здесь .

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