2013-08-24 103 views
2

當我編寫OO風格的JavaScript時,我最終得到的對象通常是從<div> s派生的。我添加了自己的屬性和成員函數,並使用jquery的appendTo()方法將其放入DOM中。如何從jquery選擇器中獲取「真實」對象

tev.layout = function() { 
       ...      
     }; 

tev.appendTo(lane.scrolled); 

但是,當我通過jquery選擇器檢索這些對象時,我的屬性不再存在。在上面的例子中,layout()函數不再可見。我可以使用jquery的attr()函數添加屬性,但這看起來很醜。

偶爾我通過保留自己的私人副本來解決這個問題。這些對象將保留我給他們的所有屬性。但是,這看起來很浪費,因爲我將不得不編寫自己的對象遍歷查詢,而不是使用jquery。

什麼是使jQuery選擇器返回我的對象​​的所有屬性的最佳途徑?

+0

$(selector).get(0)如果我沒有記錯的話。 – ninty9notout

+0

如果多數民衆贊成你正在尋找一個較短的將是'$(選擇器)[0] ...'。 –

回答

2

您在這裏遇到的問題是您將自定義屬性附加到jQuery對象,但是每次調用$時,都會生成一個新的帶有匹配元素的jQuery對象。

考慮一下:

var a = $("div"), b = $("div"); 
a.testProperty = true; 
alert(b.testProperty); // undefined 

你實際上並沒有添加屬性的元素。但是,如果你這樣做:

var a = $("div"), b = $("div"); 
a[0].testProperty = true; 
alert(b[0].testProperty); // true 

由於屬性被添加到底層DOM節點,這是兩個對象完全相同的節點,屬性是兩側接近。

+1

我不認爲他要求這個解決方案。在你的解決方案中,你保留了dom元素的副本。他想要的是在設置testproperty後調用'''b = $('div')'''的值也應該爲true。技術上不可能的。 – Tushar

+0

在IE <= 8時可能導致內存泄漏 – FakeRainBrigand

1

使用數據功能。

var $element = $('some_selector') 
$element.data("stuff", { 
    layout: function(){} 
}); 
0

簡短的回答是,你不能。我認爲你需要了解HTML和DOM的區別。 DOM是一個API,瀏覽器可以使用它來操作原來是文本的HTML。有關更多詳細信息,請參見this問題。

所以基本上當你使用JQuery時,它只會通過DOM api進行更改,因此僅限於api公開的內容。您已經嘗試過的解決方案是唯一的選擇,也是最常用的解決方案。

相關問題