你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> iOS safari BUG 總結

iOS safari BUG 總結

編輯:關於IOS

iOS safari BUG 總結

safari對DOM中元素的冒泡機制有個奇葩的BUG,僅限iOS版才會觸發~~~   BUG重現用例請見線上DEMO: 地址   bug表現與規避 在進行事件委托時,如果將未存在於DOM的元素事件直接委托到body上的話,會導致事件委托失效,調試結果為事件響應到body子元素為止,既沒有冒泡到body上,也沒有被body所捕獲。但如果事件是DOM元素本身具有的,則不會觸發bug。換而言之,只有元素的非標准事件(比如click事件之於div)才會觸發此bug。   因為bug是由safari的事件解析機制導致,無法修復,但是有多種手段可以規避   如何避免bug觸發:不要委托到body結點上,委托到任意指定父元素都可以,或者使用原生具有該事件的元素,如使用click事件觸發就用a標簽包一層。   已觸發如何修補:safari對事件的解析非常特殊,如果一個事件曾經被響應過,則會一直冒泡(捕獲)到根結點,所以對於已大規模觸發的情況,只需要在body元素的所有子元素綁定一個空事件就好了,如:   ("body > *").on("click", function(){};); 可能會對性能有一定影響,但是使用方便,大家權衡考慮吧~~~   事件委托機制的小研究 對於事件委托,有人認為可以用addEventListener第三參數來控制,其實究其根本,事件冒泡與委托機制關系並不大。從溝通中看出來相當多的一部分人認為第三參數的作用是控制事件是否冒泡到根結點,其實從官方解釋來看,他的作用是控制事件觸發在捕獲階段還是冒泡階段。也就是說,如果根本不存在事件冒泡這個機制,事件委托依然是可以完成的,為什麼呢?   還有事件捕獲啊,況且這個才是W3C標准。   最初本來就是沒有冒泡的,IE為了某些大家都懂的目的,把捕獲過程反過來"創造"出了冒泡機制,所以事件響應的機制其實是:由外到內的捕獲->元素本身事件->由內到外的冒泡。所以同理,stopPropagation()方法也不僅僅是針對冒泡,而對事件在捕獲階段也同樣有效果,簡而言之,就是阻止把事件分派到其他節點,被其它所節點響應。   但是由於某些歷史原因,雖然規范明確要求捕獲階段不會涉及事件目標,但IE9、Safari、Chrome、Firefox和Opera9.5及更高版本都會在捕獲階段觸發事件對象上的事件。結果就是有兩個機會在目標對象上操作事件。
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved