2012-10-12 9 views
5

erleben seltsame Verhalten und nicht funktionierende Ereignis Delegation in iOS6, ist die Wurzel dessen, dass, wenn ich nur einen Event-Handler anhängen, document.body wie so:klicken Ereignislistener an Dokument angehängt.Körper nicht in iOS6 feuern?

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

dieses nicht laufen lassen, zum Beispiel, wenn ich gehe zu google.com und füge das via Safari remote webinspector hinzu. In einigen Fällen wird es ausgeführt, auch wenn ich auf einen Link auf der Seite klicke oder auf ein Element klicke, das direkt mit einem Event-Handler verbunden ist. Das selbe funktioniert in den großen Browsern und auf iOS 5 und 4. Das Hinzufügen von touchend zu body löst aus, wie es sollte und könnte eine mögliche Abhilfe sein, aber es ist wirklich vorzuziehen, den Browser Klicks erkennen zu lassen, anstatt einige Klickerkennung in Touchstart programmieren zu müssen/touchend. Ich frage mich, ob das ein iOS6 Bug ist. aber ich habe noch niemanden gesehen, der sich darüber beschwert hat.

+0

Nach meinen Ergebnissen, wenn ich einen Klick-Handler an ein div anfügen, das allein als direktes Kind des Körpers sitzt und die ganze Seite einhüllt, dann wird das funktionieren. Und als Nebeneffekt wird auch der Body-Click-Event-Trigger ausgelöst ... Wenn dem Child-Div kein Event zugeordnet ist, dann wird nach wie vor kein Event auf Body ausgelöst. – bonklers

Antwort

0

@Bonkers ... Der Grund dafür, warum der Body-Klick ausgelöst wird, nachdem das click -Ereignis an das div angehängt wurde, liegt ausschließlich an der Ereignis-Bubbling.

ich Ihren Code hier repliziert zeigen, dass es zweimal auf dem div aufgerufen wird aber nur einmal auf dem Körper:

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

Wenn Sie das Ereignis von sprudelnden stoppen wollten, könnten Sie e.stopPropagation() aufrufen ; oder e.cancelBubble = wahr;

+0

Ja, das ist in Ordnung, aber das ist nicht der Fehler, der Fehler ist, dass der an den Körper angeschlossene Hörer nicht reagiert. Während es in iOS5 tut. – bonklers

Verwandte Themen