最近在項(xiàng)目中遇到一個(gè)問題:
優(yōu)惠券通過異步調(diào)用后臺(tái)接口生成,其中有一個(gè)點(diǎn)擊交互义钉,點(diǎn)擊查看詳情會(huì)出現(xiàn)優(yōu)惠券詳情鄙麦,內(nèi)容如下
乍一看簡直so easy,直接給這個(gè)dom綁定一個(gè)點(diǎn)擊事件就ok了馋吗,
$(".act-body-body").click(function(){
????? $(this).toggleClass('show').parents('.act-body').next().slideToggle();
})
呵呵焕盟,so naive,意料之外又情理之中地失效了宏粤,懵逼了一會(huì)才反應(yīng)過來脚翘,綁定點(diǎn)擊事件在優(yōu)惠券渲染之前進(jìn)行了灼卢,導(dǎo)致這個(gè)綁定失效。
而目前的項(xiàng)目也沒有用vue等一系列框架來維護(hù)来农,完全是原生js+少量jq鞋真,思量一番后我決定用事件委托來實(shí)現(xiàn)這個(gè)功能。
事件委托是什么意思呢沃于?JavaScript高級(jí)程序設(shè)計(jì)上講:
事件委托就是利用事件冒泡涩咖,只指定一個(gè)事件處理程序,就可以管理某一類型的所有事件揽涮。
也就是說抠藕,我們可以利用事件委托這個(gè)特性來綁定target的父級(jí)事件,通過父級(jí)點(diǎn)擊事件的冒泡特性來觸發(fā)到目標(biāo)元素的點(diǎn)擊事件蒋困。
所以我直接把點(diǎn)擊事件綁定到了document盾似,通過document來委托代理這個(gè)點(diǎn)擊事件:
$(".document").on('click','.act-body-body',function () {
???? $(this).toggleClass('show').parents('.act-body').next().slideToggle();
});
結(jié)果在網(wǎng)頁測(cè)試沒有問題,但在用ios手機(jī)測(cè)試打開仍然失效雪标,后來經(jīng)過排查零院,發(fā)現(xiàn)ios系統(tǒng)使用事件委托時(shí),必須要綁定在其直接父級(jí)上村刨,否則不會(huì)生效告抄,因此我把ducument改為其直接父級(jí),這個(gè)問題完美解決嵌牺。
比較有代表性的兼容性問題打洼,記錄一下。