2012-03-22 55 views
5

我的頁面上有多個圖像。爲了檢測破碎的圖像,我在SO上使用了這個。jQuery.one()和jQuery.on()之間的區別

$('.imgRot').one('error',function(){ 
    $(this).attr('src','broken.png'); 
}); 

這對我理解的第一個圖像很好。但是,當我改變這

$('.imgRot').on('error',function(){ 
    $(this).attr('src','broken.png'); 
}); 

它不適用於任何圖像。有人能告訴我爲什麼嗎?

回答

6

如果您查看jQuery 1.7中.one()的源代碼,它只是在內部調用.on(),除了事件觸發後,它將刪除事件處理程序。所以,在你的情況下應該沒有什麼區別,因爲error是一個事件,每個對象只能發生一次。

因此,您的代碼中必須有其他事情發生,例如當您運行此代碼或類似代碼時,圖像對象可能尚未加載到DOM中。

如果您嘗試使用委託事件處理來執行此操作(您的示例未顯示),則可能會遇到「錯誤」事件無法傳播的問題。

也可能是您的代碼由於緩存而存在計時問題。嘗試在已經存在於DOM中的圖像上安裝這些類型的錯誤處理程序是競爭條件。您正在嘗試在被調用之前安裝錯誤處理程序,但圖像已經開始加載,並且事件在安裝事件處理程序之前可能已經觸發。隨後的頁面加載(第一次之後)可能已經緩存了其他頁面元素或DNS引用,因此它可能會更快地到達錯誤處理程序,甚至可能在您的JS可以運行並安裝錯誤處理程序之前。

我知道這是瀏覽器緩存和onload事件的問題。如果您在嵌入式HTML中附加事件處理程序(因此在<img>標記首次被解析時,或者在.src屬性已設置(如果以編程方式創建圖像時)之前附加它),您只能可靠地獲取onload事件。這將意味着你不能可靠地設置error處理程序,你正在做的圖像,在頁面HTML的方式

我的建議是這樣的:

  • 不要嘗試安裝錯誤處理程序像這樣在圖像在DOM之後。
  • 如果您將它們分配給程序員生成圖像,然後在分配.src之前分配事件處理程序。
  • 如果您在頁面的HTML中需要這些圖像,那麼您必須將事件處理程序放在HTML中,類似<img src="xxx" onerror="yourErrorFunc(this)">,因爲這是確保在事件發生之前安裝處理程序的唯一方法。
9

社區wiki:這個通用的答案不會影響OP發佈的問題,但與標題相關。

一個()上的概念()可以用下面的代碼說明。

one()函數在第一次出現後自動移至關閉狀態。

on()與one()相同,但需要手動置於off狀態,否則實例的數量沒有限制。

var i = 1; 
 
$('.one').one('click', function() { 
 

 
    $(this).text('I am clickable only once: ' + i); 
 
    i++; 
 
}); 
 

 
var j = 1; 
 
$('.multiple').on('click', function() { 
 

 
    $(this).text('I was clicked ' + j + ' times'); 
 
    j++; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="one">Click me</div> 
 
<div class="multiple">Click me</div>

0

jQuery將重用 「上」,爲 「一個」 的方法。以下是jQuery的內部代碼,他們將硬編碼值「1」傳遞給jQuery.on()的函數。它們將使用jQuery.off()進一步關閉元素上的觸發事件()

on:function(types, selector, data, fn, one) { 

    if (one === 1) { 
      origFn = fn; 
      fn = function(event) { 
      jQuery().off(event); 
      return origFn.apply(this, arguments); 
      }; 

    } 
    off:function(types, selector, data, fn){ 
     on(types, selector, data, fn, 1); 
    } 

因此,在您的情況下,「錯誤」是在第一個圖像上觸發的事件類型,並且當調用此事件的jQuery.one()方法被關閉,然後在$('。imgRot')上未觸發它時元素