javascript 點擊事件執行兩次js問題
在JQuery中存在unbind()方法,先解綁再添加點擊事件,解決方案為:
$(".m-layout-setting").unbind('click').click(function(){
//此處填寫邏輯代碼
})
------
因為利用js在頁面加載后添加需要點擊事件的代碼,發現在點擊后會代碼會執行兩次,因為有toggle效果,導致彈窗出現又很快丟失
查了一些資料,發現這是冒泡的原因,需要在點擊事件代碼中加入阻止冒泡的方法:
e.stopPropagation();
但是發現還是不行
后面查到,off函數可以解除由on函數所綁定的事件,所以在js代碼中on函數前調用下Off函數,就正常了:
$("li.taskli").off('click','a').on('click','a',function(e){ //在on綁定前調用off去除綁定
//$(document).on('click','li.taskli a',function(e) { //原先的寫法
console.log("here")
if ($(this).parent().find('div.popover').size()>0)
{
$(this).popover('destroy')
}else{
var uuid = $(this).attr('targetuuid');
var taskhtml = '<div id="taskview">' + popheadDivHtml()+'</div>';
$(this).popover({
placement:'bottom',
title:uuid,
html:'true',
content:taskhtml
}).popover('toggle');
getResultFromFile(uuid)
}
e.stopPropagation(); //阻止冒泡
})
解決jquery綁定click事件出現點擊一次執行兩次問題
問題定位:通過瀏覽器F12定位到點擊一次出現兩次調用。
問題復現:
$("#mail_span").on("click",function(){
if($(".treeselect").children(".treeselect-up").css("display")=="none"){
treeSelectClick();
var $up = $(".treeselect").find(".treeselect-up");
$up.css({
display : "block"
});
$("#mail_bottom").attr("class", "glyphicon glyphicon-triangle-top");
}else{
treeSelectClick();
$("#mail_bottom").attr("class", "glyphicon glyphicon-triangle-bottom");
}
}
})
問題解決:
$("#mail_span").on("click",function(e){
if(!e.isPropagationStopped()){//確定stopPropagation是否被調用過
if($(".treeselect1").children(".treeselect-up").css("display")=="none"){
treeSelectClick();
var $up = $(".treeselect1").find(".treeselect-up");
$up.css({
display : "block"
});
$("#mail_bottom").attr("class", "glyphicon glyphicon-triangle-top");
}else{
treeSelectClick();
$("#mail_bottom").attr("class", "glyphicon glyphicon-triangle-bottom");
}
}
e.stopPropagation();//必須要,不然e.isPropagationStopped()無法判斷stopPropagation是否調用過
})
查閱資料:
event.preventDefault() :阻止默認行為,可以用 event.isDefaultPrevented() 來確定preventDefault是否被調用過了
event.stopPropagation() :阻止事件冒泡,事件是可以冒泡的,為防止事件冒泡到DOM樹上,不觸發任何前輩元素上的事件處理函數,可以用 event.isPropagationStopped() 來確定stopPropagation是否被調用過了
