Вы всегда можете просто установить делегирование, а затем сделать свой предикат внутри обработчика события:
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 ()" сделает это.: -)