Uso la seguente funzione per verificare se l'obiettivo è un delegato.
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;
}
Sto usando il filtro jQuery perché lo uso molto e con alcuni selettori più complessi.
Usage:
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
}
});
Questo non funziona con tutti i selettori, ma io direi che è meglio che in di André che sarà ancora funzionare se il tuo "target" ha elementi figlio. Per esempio.
<div id="parent">
<div class="child">
<div class="text">Test</div>
</div>
</div>
André di fallirà qui perché target
è il [div.text]
e non ha la classe.
Per l'utilizzo sopra di _getDelegate, diciamo '$element = $("#parent")
. Se hai toccato la parola "Test" event.target
sarebbe [div.text]
(dove hai toccato) e event.currentTarget
sarebbe [div.parent]
(dove è registrato il gestore). Quando hai chiamato _getDelegate
con questi parametri, riceverai [div.child]
e saprai che dovresti eseguire il codice del gestore.
Per una versione JS pura, ti piacerebbe qualcosa di simile, dove cerchi i genitori per vedere se colpisci qualcosa.
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');
}
Ci sono ancora molti difetti con questo. L'indice indexof className è una cattiva idea perché le classi possono essere sotto-stringhe l'una dell'altra, ad es. "myClass" e "myClass2". Inoltre, il mio codice presuppone che tutti i tuoi sottoelementi siano posizionati all'interno dei loro genitori.
Controllo target - saranno ** ** solo lavoro se si fa clic su elemento con '.item'. Ma se all'interno di quel '.item' c'è un altro elemento e fai clic su quell'elemento interno - l'ispezione del bersaglio NON aiuterà. avresti bisogno di scansionare il suo genitore (che è ciò che altre risposte fornite) - che esattamente quello che volevi nella tua domanda '$ .on ('tap', '.item', function() {...}'. with jquery - usando il tuo codice in questione, ti verranno fornite le giuste informazioni ANCHE se hai fatto clic su un elemento interno su '.item' –
Come puoi vedere qui - ispezionando il target mostrerai il pulsante che non è' .item' http://jsbin.com/hobenunale/1/edit?html,js,output - mentre jquery ti mostra l'elemento delegeated –