2012-10-12 29 views
5

Doświadczanie dziwne zachowanie i braku delegacji funkcjonowanie zdarzeń w iOS6, korzeń, który jest, że jeśli po prostu dołączyć do document.body obsługi zdarzeń, jak to:kliknij odbiorców zdarzeń dołączonych do document.body nie uruchamiaj w systemie iOS6?

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

to robi się uruchomić, na przykład, jeśli wejdź na stronę google.com i dodaj to przez zdalny webinspector w Safari. W niektórych przypadkach zostanie uruchomiony, w tym po kliknięciu łącza na stronie lub po kliknięciu elementu, do którego dołączona jest funkcja obsługi zdarzenia. To samo działa dobrze w głównych przeglądarkach i na iOS 5 i 4. Dodanie funkcji touchend do treści uruchomi się tak, jak powinno i może być potencjalnym obejściem, ale naprawdę lepiej jest pozwolić przeglądarce wykryć kliknięcia, zamiast konieczności programowania wykrywania niektórych kliknięć w trybie dotknięcia dotykiem./touchend. Zastanawiam się, czy to jest błąd iOS6. ale nie widziałem jeszcze nikogo, kto narzekałby na to.

+0

po moich odkryciach, jeśli dołączę obsługę kliknięcia do elementu div, który siedzi samotnie jako bezpośrednie dziecko ciała, zawijając całą stronę, to będzie działać. I jako efekt uboczny, że sprawi, że wyzwalacz zdarzeń click ciała również ... jeśli nie ma zdarzenia dołączonego do div dziecka, to jak wcześniej żadne zdarzenie nie wyzwala na ciele. – bonklers

Odpowiedz

0

@Bonkers ... Odwoływanie się do tego, dlaczego kliknięcie bryły zostanie uruchomione po dołączeniu zdarzenia kliknięcia do elementu div, wynika wyłącznie z propagacji zdarzeń.

I replikowane kod tutaj pokazuje, że jest wywoływana dwukrotnie na div, ale tylko raz na ciele:

<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> 

Jeśli chciał zatrzymać zdarzenie od propagacji, można nazwać e.stopPropagation() ; lub e.cancelBubble = true;

+0

Tak, co jest w porządku, ale to nie jest błąd, błąd polega na tym, że słuchacz podłączony do ciała nie reaguje. Podczas gdy w iOS5 to robi. – bonklers