2012-10-12 20 views
5

Vivere strano comportamento e la delega non evento funzionamento in iOS6, la cui radice è che se io semplicemente collegare un gestore di eventi per document.body, come così:click list ascoltatori collegati a document.body non si attiva in iOS6?

document.body.addEventListener("click", function(){alert("ios6 sucks")}, false); 

questo non ottiene gestita, per esempio se io vai su google.com e aggiungilo tramite safari webinspector remoto. In alcuni casi, verrà eseguito, anche se faccio clic su un collegamento sulla pagina o se si fa clic su un elemento a cui è collegato direttamente un gestore eventi. Lo stesso funziona bene nei principali browser e su iOS 5 e 4. L'aggiunta di touchend al corpo si innesca come dovrebbe e potrebbe essere una soluzione potenziale ma è davvero preferibile lasciare che il browser rilevi i clic invece di dover programmare un rilevamento dei clic in touchstart/touchend. Mi chiedo se questo è un bug iOS6. ma non ho visto nessun altro lamentarsi di questo ancora.

+0

in seguito alle mie conclusioni, se allego un gestore di clic a un div che si trova da solo come figlio diretto del corpo, avvolgendo l'intera pagina, allora funzionerà. E come effetto collaterale, ciò renderà anche il trigger di attivazione del corpo click ... se non ci sono eventi collegati al div figlio, allora come prima nessun evento si innesca sul corpo. – bonklers

risposta

0

@Bonkers ... Il riferimento al motivo per cui il clic del corpo viene attivato dopo aver collegato l'evento di clic al div è dovuto esclusivamente al bubbling degli eventi.

Ho replicato qui il codice che mostra che viene chiamato due volte sul div ma solo una volta sul corpo:

<div id="myDiv">FlackAttack Test</div> 

<script> 
document.body.addEventListener("click", function(){alert("ios6 sucks")}, false); 
document.getElementById('myDiv').addEventListener('click', function(){alert("ios6 sucks twice")},  false); 
</script> 

Se si voleva fermare l'evento dal bubbling, si potrebbe chiamare e.stopPropagation() ; o e.cancelBubble = true;

+0

Sì, che va bene ma questo non è l'errore, l'errore è che l'ascoltatore collegato al corpo non reagisce. Considerando che in iOS5 lo fa. – bonklers