2014-04-03 55 views
0
(function ($) { 

$.fn.gallery = function() { 
    var images = $(this); 
    return setInterval($.proxy(changeImage(images)), 500); 
}; 

var i = 0; 
var changeImage = function(images){ 
    i++; 
    console.log(i); 
    var _images = images; 
    console.log(_images.length); 
} 


}(jQuery)); 

$(function(){ 
    $('.home-gallery').gallery(); 
}); 

此代碼給了我console.log,但不會每500毫秒重複一次。我只獲得一次「i」的console.log,一次獲得「_images.length」一次。之後它不再重複。爲什麼setInterval不能在我的jQuery插件中工作?

編輯:我刪除了$ .proxy位和它仍然沒有重複

$.fn.gallery = function() { 
    var images = $(this); 
    return setInterval(changeImage(images), 500); 
}; 
+0

'$ .proxy(changeImage(圖片))'是錯誤的 – epascarello

回答

1

你沒有正確使用$.proxy,在這裏你也不需要它。只是,簡單地做:

return setInterval(function(){ 
    changeImage(images) 
}, 500); 
+0

我編輯了我的帖子,仍然不起作用 – user1426594

+1

@ user1426594:您編輯的帖子仍然不正確。檢查答案。注意我是如何傳遞'setInterval'的一個函數。您正在調用'changeImage'並將其返回值傳遞給'setInterval'。 –

+0

修復它,但我不知道爲什麼。我一直在通過傳遞一個函數來做setInterval。我不確定它爲什麼只運行一次,你能解釋一下嗎? – user1426594

1

你不可錯過這樣的事情。你必須把它包裝在一個匿名函數中。

你應該這樣做:

setInterval(function() { 
    changeImage(images); 
}, 500); 

你不需要$.proxy這裏作爲火箭危險物料的評論建議。

+0

關閉,但並不完全。這裏不需要'$ .proxy'。 '$ .proxy'就像'Function.bind',它返回一個函數。它的意思是使用像'var func = $ .proxy(changeImage,null,images);',然後你可以調用'func()',但這裏不需要,因爲'changeImage'不使用'this '。 –

+0

@RocketHazmat,檢查我的編輯。謝謝。 –

-1

這兩個答案都是正確的,但不完整。 setInterval()的第一個參數需要是一個函數或一個字符串,因此將它包裝在一個匿名函數中是一個好的開始。

接下來因爲setInterval()在計時器後再次啓動,範圍發生變化,變量'images'將不再存在。

你需要做這樣的事情:

$.fn.gallery = function() { 
    var images = $(this); 
    return setInterval((function(images){ 
     return function() { 
      $.proxy(changeImage(images)); 
     }; 
    })(images), 500); 
}; 
+0

似乎不是真的。 console.log(images.length)每次撥打電話時都輸出正確的電話號碼 – user1426594

+0

哦,你的權利。我的錯誤...我的藉口是這裏遲到了! – Akurn

+0

不,這不是事實。 'images'將*留在內存中,因爲它仍然有一個引用。另外,您正在錯誤地使用'$ .proxy'。 –

相關問題