2010-03-08 90 views
5

比方說,我有一個場景,我有一個全局插件(或至少一個插件綁定到更廣泛的事件)。jquery .live()事件交互

這個插件需要一個選擇器,並綁定一個實時點擊。事僞jQuery的可能看起來像這樣的:

$.fn.changeSomething = function(){ 
    $(this).live("change", function(){ alert("yo");}); 
} 

在另一頁,我有一個額外的生活結合是這樣的:

$("input[type='checkbox']").live("click", function(){alert("ho");}); 

在這種情況下,該複選框將理想最終被綁定到兩個現場活動。

我所看到的是,改變事件發生,因爲它應該,我驚動「喲」。但是,使用這個實時點擊事件,我從來沒有觸發它。但是,使用明確的點擊綁定,我確實打了它。

簡單的解決方法是在實時更改處理程序結束時觸發點擊事件,但對我來說這似乎很難受。有任何想法嗎?

請注意,這是使用jquery 1.4.2,只發生在IE8(我假設6/7也會,但我沒有測試過它們)。

一個例子(你需要jQuery的1.4.2.min.js):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 
<head> 
<script src="jquery-1.4.2.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
    $.fn.changeSomething = function(){ 
     var t = $(this); 
     t.live("change", function(){ 
      alert("yo"); 
     }); 
    }; 

    $(document).ready(function(){ 
    $("input[type='checkbox']").changeSomething(); 
    $("#special").live("click", function(){ 
     alert("ho"); 
    }); 
    }); 
</script> 
</head> 
<body> 
<form> 
    <input type="checkbox" id="cbx" /> 
    <input type="checkbox" id="special" /> 
    </form> 
</body> 
</html> 
+0

你能後周圍的例子的代碼不工作?例如它是否準備好了? – 2010-03-08 23:07:45

+0

當然,請參閱我最近的修改。很簡單的例子,但這基本上是流程。 – ddango 2010-03-08 23:20:52

+0

我每次都會在這裏開火,改變點燃,然後點擊...你用什麼瀏覽器出現問題? – 2010-03-08 23:25:37

回答

5

你知道,直到複選框失去焦點,對IE瀏覽器將不火的「改變」事件?

編輯雖然我認爲這是事實,但該測試頁的效果非常奇怪。我仍然在玩它。 「活」的機制讓我感到困惑,讓我有點緊張,儘管我完全理解它的價值。

我已經把(略作修改和澄清)測試頁起來:http://gutfullofbeer.net/clicks.html,我要開始做一些jQuery的調試

模糊地帶:正如在評論中指出,當我綁定一個虛擬「更改」處理程序到正文元素:

$('body').bind('change', function() { return true; }); 

然後事情開始正常工作。我確信@Alex是正確的,jQuery試圖僞造「更改」事件冒泡的方式正在發生。但仍然令人毛骨悚然。測試頁面位於http://gutfullofbeer.net/clicks-body.html,您可以通過單擊「首先使用更改處理程序設置」來看到奇怪,然後單擊複選框並注意第二個處理器上的「單擊」處理程序僅觸發一次,然後單擊「綁定處理程序到身體「,並觀察複選框之後的行爲。使用$.delegate有一個共同的祖先,而不是$.live

的關鍵與live記住

+0

有趣的發現,但進一步讓我覺得它是1.4.x中引入的bug – ddango 2010-03-09 00:34:31

+1

很可能!我將在jQuery論壇上發佈它,看看有沒有人能解釋它。 – Pointy 2010-03-09 00:38:16

1

嘗試是,事件是綁定到您選擇的元素。它被綁定到document,然後一旦事件冒泡到文檔中,它將檢查您在事件目標上傳入的選擇器。

從中學習的關鍵是,在IE中 - 更改事件自然不會像大多數瀏覽器那樣冒泡。在IE中,基於啓發式的「氣泡」事件在所有jQuery測試中都與其他瀏覽器中的實際事件相同。您的其他功能可能會阻止這種啓發式工作。所以它是有道理的,它是特定於IE的。這並不是說這是一個很好的事情...

+0

嗨,亞歷克斯!有時我會戴領帶。無論如何,這個很奇怪。我發現基於事件處理器註冊順序而改變的行爲,如果我直接將「click」處理程序綁定到$(「body」),它也會發生變化。該處理程序運行,但「click」和「change」處理程序總是運行「特殊」複選框。我會嘗試「委託」。 – Pointy 2010-03-09 00:09:55

+0

更正 - 我必須將「更改」事件綁定到正文,而不是「單擊」。 – Pointy 2010-03-09 00:17:00

+0

不錯的建議,但我已經嘗試使用$ .delegate,而不是($(「body」)。委託(「#特別」,「點擊」,功能(){...});)但這不能解決問題。然而,請注意,更改訂單仍然適用於委託,與現場一樣。 – ddango 2010-03-09 00:31:02

0

可以使用jquery.livequery plugin

$("select[name='majorsList']").livequery("change",function() 
{ 
alert('in'); 
});