JQuery делегат объекта вместо селектора в качестве первого аргумента - PullRequest
4 голосов
/ 11 июля 2011

Возможно ли передать объект вместо селектора в качестве первого аргумента для делегата jQuery?

var ancestor = $('ancestor'),
    children = ancestor.find('a');

ancestor.delegate(children, eventType, handler);

Вместо обычного:

ancestor.delegate('a', eventType, handler);

EDIT

Мотивация:

var children = $('a[href^="#"]').map($.proxy(function(i, current) {

    var href = $(current).attr('href');

    if(href.length > 1 && givenElement.find(href).length === 1) return $(current);
},
this));

$(document).delegate(children, eventType, handler);

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

1 Ответ

2 голосов
/ 11 июля 2011

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

ancestor.delegate('a[href^="#"]', 'click', function(ev) {
  if (someElement.find($(ev.target).attr('href')).length > 0) {
    // do whatever with ev.target
  }
});

Если вы хотите избежать цены выполнения этого поиска в JQuery DOMвнутри обработчика вы можете предварительно пометить все «хорошие» теги:

$('a[href^="#"]').each(function() {
  if (someElement.find($(this).attr('href')).length > 0)
    $(this).addClass("special");
});

Тогда ваш обработчик делегированных событий может просто проверить

  if ($(ev.target).hasClass('special')) {
    // do stuff
  }

, который будет работать достаточно хорошо, чтобы не бытьпроблема при любых обстоятельствах.

Причина, по которой вы должны начать работу с селектором для ".delegate ()", заключается в том, что он так и реализован.Обработчик событий всегда делает что-то вроде:

  function genericDelegateHandler(ev) {
    if ($(ev.target).is(theSelector)) {
      userHandler.call(this, ev);
    }
  }

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

edit - @DADU (ОП) правильно указывает, что если вы попытаетесь пометить все именем класса, то вам даже не нужнонеобычный обработчик событий, который тестирует;обычный ".delegate ()" сделает это.: -)

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