2011-07-17 22 views
0

我在jquery中構建了一個級聯下拉列表,從幾個示例進行了修改。我添加了一項功能讓用戶「備份」並重新選擇較早的下拉菜單。這將重新加載下一個下拉列表,並清除並禁用後面的下拉列表。級聯下拉列表 - 如何暫時禁用更改事件在下拉操作選項

http://jsfiddle.net/goodeye/gA6GZ/

的問題是第一次通過,選擇元素的變化事件綁定後,所以我想重裝新的價值觀是造成後來改變事件射擊。

我分開了.change()綁定,而不是鏈接它。我在加載選擇選項之前先將它鏈接起來。這有助於第一次通過,但不是隨後的時間。

對於這個問題,我專門找了一個好方法,這個順序:

  • 避免變化()
  • 更新的下拉菜單
  • 設置變化()

此問題: Best way to remove an event handler in jQuery? 以unbind()作爲主要答案,然後使用live()的後續答案。 live()方法使用了一個讓我感到困惑的類,並沒有得到多少選票。

要重現:
請選擇步驟1,請參閱第2步驟。
選擇第2步,請參閱第3步驟。
再次選擇第1步,請參閱第2步驟。
然後麻煩開始:
選擇第2步,見第3步啓動兩次。
選擇第3步,參見第4步打3次。
再次選擇步驟1,請參閱步驟2激發兩次。

它甚至變得更糟;我會看到第三步射擊五次。

一些細節:

在真正的代碼,從一個JSON Ajax調用這些負載。我從示例中刪除了它,並添加了硬編碼選項來模擬它,並將其作爲事件問題的範圍。

這從服務器端開始,所以第一個下拉菜單已經在html中。接下來的三個是從(模擬的)json調用中加載的。

這些使用類進行標識,因爲真實頁面具有多個這些下拉列表的集合。代碼使用$(this)小心地在所選的一個集合內工作。

如果只有一個選項,還有一個功能是「自動選擇」,然後轉到下一個選項。這段代碼就在那裏,但模擬的例子都有不止一個選項,以避免這個問題。

在此先感謝您的想法!

+0

現在我不確定它是否更新導致多個調用的選項,或者是因爲我多次調用change();每次通過序列。再次調用change()是否會導致它多次觸發? ...或者那也是另一個問題。 – goodeye

回答

0

好了,我跑出來的時候,不得不去解決它。這只是簡單地設置綁定一次 - 這就是它的一切。所以這解決了這個問題,並且不需要解除綁定/重新綁定,或者在這種情況下使用live()。

預先執行以下代碼。它綁定一次下拉菜單,並禁用第二,第三,第四,直到級聯開始調用第一個。所以綁定完成一次,然後禁用true/false切換。

$('.ddStep1').change(getStep2); 
$('.ddStep2').change(getStep3).attr('disabled', true); 
$('.ddStep3').change(getStep4).attr('disabled', true); 
$('.ddStep4').attr('disabled', true); 

(在此應用中,最後的下拉沒有改變事件;有獨立的選擇後第4次提交按鈕。)

的問題是多次調用創建綁定 - 這是一次性的事情,所以多次調用它會在變更事件上附加多個呼叫。

添加和刪除選擇選項未調用更改事件。

回答原來的問題有關暫時禁用事件(儘管不是我的問題的解決方案),我沒有得到現場使用()從這個答案去理解,並認爲這將是要走的路: Best way to remove an event handler in jQuery? 的使用名稱空間的其他答案看起來也不錯。

0

你可以做的是使用jQuery來檢查元素上的所有綁定變化事件,將它們保存在「脫機」數組中,解除綁定,做好你的事情並重新綁定它們。

要檢查您可以使用所有綁定的更改事件:

var changeEvents = $(element).data("events").change; 
jQuery.each(changeEvents, function(key, handlerObj) { 
    alert(handlerObj.handler) // alerts "function() { alert('changed!') }" 
    // also available: handlerObj.type, handlerObj.namespace 
}) 
+0

這是一個方便的消息。在這種情況下,我已經知道我有什麼約束力,所以我不需要發現它。 – goodeye