jquery有時候會出現重復注冊一個事件的問題,導致點擊一個事件,這個事件被重復執行,也就是觸發事件的次數有幾次,
那么這個事件就會被執行疊加重復幾次。
我這邊做的一個項目,在某個頁面初始化的時候,給一個控件注冊了一個事件,后來發現,進入幾次這個頁面,因為進入頁面會執行一次注冊,這個事件就會被注冊幾次,被重復執行,沒有覆蓋。
上網查詢了一下,總結了以下幾種情況:
1,通過 on方法注冊的事件,每次的注冊不會把原來的方法覆蓋掉。會以隊列的形式保存起來
點擊的時候,觸發事情會一個個按注冊的順序執行。
function initOnEvent(){ //為id為onWayToEvent 按鈕注冊點擊事件 $("#onWayToEvent").on("click",function(){ alert("this is one on event") }); $("#onWayToEvent").on("click",function(){ alert("this is two on event") }); $("#onWayToEvent").on("click",function(){ alert("this is three on event") }); }
2,通過bind的方法多次注冊事件。通過 jquery 的bind方法多次注冊的方法也是一樣,不會把原來的方法覆蓋了,也是把方法以
隊列的形式保存起來,觸發事件后按注冊次序逐個執行。
function initBindEvent(){ //為id為bindWayToEvent 的按鈕注冊點擊事件 $("#bindWayToEvent").bind("click",function(){ alert("this is registry event by bind. one") }); $("#bindWayToEvent").bind("click",function(){ alert("this is registry event by bind. two") }); $("#bindWayToEvent").bind("click",function(){ alert("this is registry event by bind. three") }); } </div>
3,通過click方法多次注冊事件。通過 jquery 的click方法多次注冊的方法也是上面的效果一樣 。
function initClickvent(){ $("#clickWayToEvent").click(function(){ alert("this is registry event by click. one"); }); $("#clickWayToEvent").click(function(){ alert("this is registry event by click. two"); }); $("#clickWayToEvent").click(function(){ alert("this is registry event by click. three"); }); }
4,通過live 方法多次注冊事件。
要怎么樣才能把前面的事件給覆蓋掉,只保留最后注冊的事件方法?
1,通過unbind,bind方法進行事件的唯一注冊
$("#oneEvnetByBind").unbind("click").bind("click",function(){ alert("only you !!!!!!!"); });
2,通過 die live 方法進行事件的唯一加載
$("#oneEvnetByDieLive").die().live("click",function(){ alert("the one of you !!!!!!"); });
3,off() 方法通常用於移除通過 on() 方法添加的事件處理程序。
$("button").click(function(){ $("p").off("click"); });