JS: javascript 點擊事件執行兩次js問題 ,解決jquery綁定click事件出現點擊一次執行兩次問題


 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是否被調用過了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM