2011-04-06 28 views
0

我分配一個onclick處理程序複選框。有時候,綁定事件的javascript運行不止一次(在部分回發上)並且處理程序被分配兩次。我怎樣才能防止處理程序分配多次?jQuery/JavaScript的 - 只有當它尚未分配的線程事件處理程序

好的,謝謝你的回覆。我寫的東西了找出如果元素具有hanlder:

$.fn.hasHandler = function(eventName, handler) 
{ 
    var _hasHandler = false; 

    if(handler != undefined && this.data("events") !== null && this.data("events") !== undefined) 
    { 
     $.each(this.data("events"), function(name, handlers) 
     { 
      if(name === eventName)  
      { 
       $.each(handlers, function(index, value) 
       { 
        if(value.handler === handler) 
        { 
         _hasHandler = true; 
        } 
       }); 
      } 
     }); 
    } 

    return _hasHandler; 
} 
+0

如果您正在查看部分帖子後臺,您是否重新分配了處理程序,因爲該元素已被重新創建? – StuperUser 2011-04-06 15:15:57

+0

國際海事組織你需要改善你的結構有點像在部分回傳呈現的JS代碼中分配事件不是一個好主意。我很想知道你的用例,爲什麼你不能將事件代碼拉到寬javascript應用程序? – neebz 2011-04-06 15:21:05

回答

1

假設你有:

<input type="checkbox" id="myCheck" /> 

您的JavaScript可能是:

var clickFound = false; 
$.each($("#myCheck").data('events'), function(i, e) { 
    if(i === 'click') { 
     clickFound = true; 
    } 
}); 
if(!clickFound) { 
    $("#myCheck").click(function() { 
     // ... 
    }); 
} 

用於通過jQuery at this question必然事件查看更多的測試。

是否有原因,但是,您不能使用delegate或更早的live來允許您的處理程序綁定一次,然後爲所有匹配的元素保留?

+0

對於正在閱讀本文的人,我更新了最終解決方案的問題。 – 2011-04-06 22:23:38

1

你可以當你添加單擊處理程序類添加到您的複選框,再後來檢查類的存在。

您還可以在添加一個作爲替代方法之前使用點擊處理程序unbind

或者,最乾淨的事情可能是防止你的代碼運行兩次。

4

您可以先解除綁定。 ('#foo')。unbind('click')。bind('click',function(){...在這裏做的東西...});

+1

儘管'unbind(eventName)'將解除所有單擊事件處理程序的綁定。如果函數存儲在變量中,則可以單獨取消綁定。 – StuperUser 2011-04-06 15:45:04

+0

這可能是一個更容易的修復,但這並不能回答我的原始問題。謝謝你。 – 2011-04-06 22:22:20