Я использую следующую функцию для проверки, является ли цель делегатом.
function _getDelegate(selector, target, currentTarget) {
var delegate = null;
while (target && target != currentTarget) {
delegate = $(target).filter(selector)[0];
if (delegate)
return delegate;
target = target.parentNode;
}
return delegate;
}
Я использую фильтр jquery, потому что я использую его много и с более сложными селекторами.
Использование:
var delegationSelector = ".child";
$element.hammer()
$element.on("tap", function handler(event){
var delegate = _getDelegate(delegationSelector, event.target, event.currentTarget);
if(delegate){ // or if(!delegate) return;
// Your handler code
}
});
Это не будет работать со всеми селекторов, но я бы сказал, что это лучше, чем в Андре, что он все равно будет работать, если ваш «целевой» имеет дочерние элементы. Например.
<div id="parent">
<div class="child">
<div class="text">Test</div>
</div>
</div>
Андре потерпит неудачу, потому что здесь target
является [div.text]
и не имеет свой класс.
Для вышеуказанного использования _getDelegate, давайте скажем $element = $("#parent")
. Если вы набрали слово «Тест» event.target
, будет [div.text]
(где вы прослушивали) и event.currentTarget
будет [div.parent]
(где зарегистрирован обработчик). Когда вы вызываете _getDelegate
с этими параметрами, вы получите [div.child]
и знаете, что вы должны запустить код вашего обработчика.
Для чистой версии JS вам понадобится что-то вроде этого, где вы зацикливаетесь на родителях, чтобы посмотреть, ударило ли вы что-нибудь.
var delegate;
var target = e.target; // e.g. Inner div
var currentTarget = e.currentTarget // e.g. #parent
while(target && target != currentTarget){
if(target.className.indexOf('child')!=-1){
delegate = target;
break;
}
target = target.parentNode;
}
if(delegate) {
console.log('delegated tap received');
}
Есть еще много недостатков с этим. Весь индекс классаName - плохая идея, потому что классы могут быть подстроками друг друга, например. «myClass» и «myClass2». Кроме того, мой код делает предположение, что все ваши подэлементы расположены в пределах их родителей.
Осматривая цель - будет ** ** только работа, если нажать на элемент с '.item'. Но если внутри этого '.item' есть другой элемент, и вы нажимаете на этот внутренний элемент - проверка цели не поможет. вам нужно будет отсканировать своего родителя (это то, что предоставили другие ответы) - что именно вы хотели в своем вопросе '$ .on ('tap', '.item', function() {...}'. with jquery - используя ваш код, вам будет предоставлена правильная информация EVEN, если вы щелкнули во внутреннем элементе на '.item' –
Как вы можете видеть здесь - проверка цели покажет вам кнопку, которая не является' .item' http://jsbin.com/hobenunale/1/edit?html,js,output - в то время как jquery показывает вам удаленный элемент. –