2011-03-25 48 views
1

我寫了一個jQuery plugin,我最近做了這麼回調訪問this,這是原來的選擇,所以你可以做...當創建一個jQuery插件時,「this」是否在任何回調中都是本地DOM元素?

$('#something').waitForImages(function() { 
    $(this).fadeIn(500); 
}); 

這看起來非常像一些代碼你期望在jQuery API中。

但是,jQuery總是提供this作爲本機DOM元素,因此您必須將其包裝爲$()以開始調用jQuery的方法。

Originally,我提供this作爲jQuery對象。但後來,觀察jQuery的處理this,I changed it

什麼是最好的方法?提供它包裝或不?

回答

6

我會說離開它解包在這種情況下,因爲這似乎是一個事件處理程序。在事件處理程序幾乎總是(jQuery中原JS事件處理程序),你希望thisDOM元素你正在處理......這是慣例我會堅持使用。

一般情況下,嘗試時,你可以去與最小驚訝的原則。

如果你願意,你也可以通過包裹元素作爲參數傳遞給函數,例如:

$('#something').waitForImages(function(e, jQueryObjectHere) { 
    $(this).fadeIn(500); 
}); 

...這樣,你是不是做意想不到的事情,但如果提供的好東西他們被通緝。我絕對不會說這是必要,只是方便。以上只是一種選擇(隨筆真的)......但如果你暴露此事件的東西,你可以.bind()到,做到這一點,因爲它們可能會結合更多的數據和期待。

+0

+1 - 我真的不希望它有太大的不同。 – Nic 2011-03-25 02:31:54

+0

+1這對我很有意義,謝謝Nick。 – alex 2011-03-25 02:35:21

+0

@alex - 歡迎! – 2011-03-25 02:45:52

0

this指由jQuery函數返回選定的元件的陣列。重新包裝元素是非常不必要的。

+2

謝謝,但我不認爲這真的回答了我的問題。 – alex 2011-03-25 02:24:24

+0

怎麼樣?你問你是否應該重新包裝它,我說不。 – Kayla 2011-03-25 02:27:13

+0

這不是插件,這是一個針對* for *插件的事件調用,例如'this'是'.click()'處理程序中的DOM元素,更類似於這種情況。 – 2011-03-25 02:28:02

1

很多時候,當我寫一個jQuery插件,我會立刻分配this給一個變量,像這樣:

$.fn.myPlugin = function() { 
    var $this = this; 
}; 

主要的原因是,這樣我可以重新定義this內部函數內引用原來選擇,但這裏更重要的原因是它自己的this看起來像一個展開的DOM元素,所以$this前面的$幫助我記住它已經被包裝了。

因此,我認爲你應該確實提供this作爲DOM元素,並讓用戶將它包裝在$()中,如果他們願意的話。

2

原始DOM元素是,如果你寫你的插件的人會期待什麼。你可能覺得改變它更方便和可讀,但它不是標準的,如果你打算將它分發給開源社區,它只會導致jQuery對象的混淆和重複。 $(this)this引用預先存在的jQuery集合不會錯誤,但絕對不會有效。

您的代碼將迭代集合併爲任何元素執行回調,因此您可以將集合中單個元素的每個回調想象爲整個集合中的一次執行。

希望這解釋了關於設計選擇的合理和「高層次」的願景。歸結爲語義和一致性。

相關問題