2013-01-15 13 views
2

包裝兩次與jQuery的HTML元素是一個安全的操作,因爲它返回相同的DOM元素的一個實例:展開安全jQuery的情況下拿到包裹的DOM元素

var $a = $('#foo'); 
var $b = $($a); 
alert($b.get(0) === $a.get(0)); // true 

它允許配置的靈活設置對象,它可能包含選擇器,DOM元素或jQuery實例。

我不知道它,所以在我的個人圖書館我擴展jQuery的方法來安全地包裝和解包對象。

在jQuery核心中是否存在一個安全的向後操作來從相對jQuery實例中解開DOM元素?
我意味着什麼表現得像是:

function unwrap(obj) { 
    return (obj instanceof jQuery) ? obj.get(0) : obj; 
} 

,它足夠聰明,讓每一次避免條件檢查。

+0

jQuery不能比底層JavaScript引擎本身更智能。 –

回答

1

Detect DOM object vs. jQuery Object似乎包含這個問題的答案。

每個jQuery對象都有一個jQuery屬性。喜歡的東西:

function unwrap(obj) { 
    return (obj.jquery) ? obj.get(0) : obj; 
} 
+0

這比'obj instanceof jQuery'好得多嗎?我認爲OP的解決方案更好;立即清楚什麼被評估(並且不容易出錯)。 –

+0

我明白這個問題是要求替代'intanceof'語法。 – twernt

+0

'instanceof'在跨框架環境中工作有困難,實際上,'obj [0]'而不是'obj.get(0)'是我對該主題的唯一建議。 – gnarf

1

這將更有意義包裹在jQuery的一切,然後只抓出結果數組的第0個元素:

jQuery(elem)[0]; 

如果傳遞一個jQuery對象,jQuery(jQueryObject)將返回相同元素以相同的順序排列。如果傳遞一個元素,則返回該元素。如果你傳遞一個jQuery對象,這將返回其中的第一個元素。如果您傳遞選擇器,則返回DOM中的第一個匹配項。

我們在jQuery UI中使用了類似的技術來基本解決您在選項中傳遞給窗口小部件的任何選擇器/元素/ jquery對象。

+1

這是有道理的,並且更簡潔,雖然行爲不完全相同。此方法將爲有效的選擇器字符串返回一個DOM對象,或者爲無效的選擇器字符串返回「undefined」。另一種方法將返回字符串參數本身。 – twernt

相關問題