2014-11-17 47 views
1

我們偶然發現了兩個jQuery版本之間的不兼容性,這些版本正在破壞我們的應用程序之一。從1.7更新到最新的2.1版本時出現問題,但縮小到1.8.0和1.8.1之間的差異。jQuery 1.8.0到1.8.1與.on()選擇器不兼容

我建了一個小提琴here (1.8.0, working)here (1.8.1, broken)

HTML

<div class="outer"> 
    <div class="eventcontext"> 
     <a href="#targetNope" class="hasevent">Click me!</a> 
    </div> 
</div> 

JS

$('.eventcontext').on('click', '.outer a.hasevent', function(e) { 
    e.preventDefault(); 
    e.stopPropagation(); 

    $('#targetYep').show(); 
}); 

在1.8.0使用匹配所需的元素,與所述選擇器爲「上方」的事件上下文作品的一部分沒有任何問題的選擇器,就像原生querySelector一樣,而在1.8.1中則沒有。

這是一個有意的改變,還是我們可以預料到在某些時候這是「固定的」?我想知道這是否可能是一個錯誤,因爲它發生在修補程序版本更新中,會破壞東西(至少在我們的情況下),但在最新版本中仍然是相同的。

回答

1

jQuery 1.8.1 Change Log

Events: #12383: jQuery.on() selector should only apply to descendants of the element 

所以,當你從選擇刪除.outer它的工作原理。

同時工作,因爲選擇是元素的後代處理該點擊:

$('.outer').on('click', '.eventcontext a.hasevent', function(e) { /**/ }); 
$('.outer').on('click', 'a.hasevent', function(e) { /**/ }); 

孰料更改原因:老版本有搜索整個文檔,以獲取由選擇,這是緩慢的匹配元素。而對於事件授權,在之外搜索處理事件的元素是沒有意義的。

+0

性能原因很有道理!我仍然會看看jQuery源碼,看看究竟發生了什麼。如前所述,'querySelector'確實在這種情況下工作,所以如果他們在底層使用Sizzle將不得不做額外的工作來獲得這種行爲。感謝您的回答,並在變更日誌中指出該行!我一定錯過了。 – MildlySerious