2012-04-08 67 views
0

我在調用輸入對象中的'click'函數時遇到了一些問題。功能分配一個事件輸入:在JavaScript文件name.js和name2.js在jquery中雙擊'click'事件

function v_start() { 
     $('#next').click(function(){ 
        v_check(); 
     }); 
} 

現在我有: 複製代碼

$(function(){ 
     v_start(); 
}); 

僅僅是一個例子,但在這種情況下,函數v_check將在一次點擊輸入中被調用兩次。是否只是將事件做成一次的條件或方式?爲什麼第二個事件不會被覆蓋?

+2

你可能附加事件處理程序兩次。添加'alert(123);'在那裏並參見 – zerkms 2012-04-08 12:43:20

+1

如果代碼片段同時位於'name.js'和'name2.js'中,它將連接兩次事件處理程序,因此觸發兩次行爲。 – m90 2012-04-08 12:50:37

回答

1

每當你在jQuery中處理一個事件,它增加處理程序的列表。沒有「覆蓋」。

在這種情況下避免將事件分配兩次的簡單解決方案是附加一個數據標誌,指示事件已被連接,例如這樣。

function v_start() { 
    if (!$('#next').data('click-handled')) { 
     $('#next').data('click-handled', true).click(function(){ 
      v_check(); 
     }); 
    } 
} 

(您也可以手動獲得事件的列表,並檢查你的函數是存在的,但是這是相當多的更復雜。)

2

解除綁定和綁定,以確保事件處理程序只加一次:

$("#mySelector").unbind("click").bind("click",myFunction) 

如果有多個事件偵聽器:

var myFunction = function(e){ /// my code } 

$("#mySelector").unbind("click",myFunction).bind("click",myFunction) 
+0

或者,如果您使用的是jQuery 1.7+,請使用'.off()'和'.on()'而不是'.unbind()'和'.bind()'。 – 2012-04-08 13:14:45

1

既然你打電話v_start在每個文件中明顯地兩次綁定事件兩次。你可以做一個簡單的檢查,如果click事件這樣既處理:

function v_start() { 
    var $next = $('#next'); 
    $next.data('events').click || $next.click(v_check); 
} 
1

用途:

$(".mybutton").off('click').on('click', function() { 
// same code 
}); 

這對我來說是最好的解決辦法,否則太

$(".mybutton").unbind("click",myFunction).bind("click",myFunction)