今天在給JQgrid中的標簽添加click事件的時候,發現一個問題。
JQgrid的table中,點擊任何位置,都會勾選點擊行的checkbox,而我希望在點擊我的標簽的時候,不要勾選checkbox。
查看JQgrid源碼,發現它的click事件是綁定到了table上,然后判斷事件點擊目標,找到選中行給它勾選;而我的click事件是綁定到td里面的div中。
按照事件冒泡的觸發順序,應該是我的事件先觸發,之后是JQgrid的事件。
結果不是這樣的。我發現JQgrid使用$().click(function(){})綁定的事件,而我使用$("body").on("click","",function(){})綁定的事件。
我希望比較一下它們的差別,專門寫了一下代碼,查看運行結果。
代碼如下:
<div id="div_2" onclick="console.error('onclick_2')">
<div id="div_1" onclick="console.error('onclick_1')">
Click this Div
</div>
</div>
JS:
$(function(){
$("body").on("click","#div_2",function(){
console.error("on bind click 2");
});
$("body").on("click","#div_1",function(){
console.error("on bind click 1");
});
$("#div_2").click(function(){
console.error("click 2");
});
$("#div_1").click(function(){
console.error("click 1");
});
});
執行結果:

得到結論:
onclick,click,on()的優先關系:onclick>click>on();
onclick和click綁定的事件,彼此之間遵守事件冒泡規則,從內到外觸發;
on()綁定的事件,總是晚於onclick和click綁定的事件觸發;
由此可以得到,使用on()綁定的事件與onclick和click綁定的事件,判斷觸發先后順序時,不能只考慮事件冒泡規則。
