Javascript 安全地展开jQuery实例以获取包装的DOM元素

Javascript 安全地展开jQuery实例以获取包装的DOM元素,javascript,jquery,dom,Javascript,Jquery,Dom,使用jQuery将HTML元素包装两次是安全的操作,因为它返回同一DOM元素的实例: var $a = $('#foo'); var $b = $($a); alert($b.get(0) === $a.get(0)); // true 它允许灵活地设置配置对象,其中可能包含选择器、DOM元素或jQuery实例 我不知道,所以在我的个人库中,我用方法扩展了jQuery,以安全地包装和展开对象 jQuery核心中是否有一个安全的向后操作来从它们的相对jQuery实例中展开DOM元素 我是说像这样

使用jQuery将HTML元素包装两次是安全的操作,因为它返回同一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;
}
它足够聪明,可以避免每次的条件检查。

似乎包含了这个问题的答案

每个jQuery对象都有一个jQuery属性。比如:

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

将所有内容包装在jQuery中,然后从结果数组中获取第0个元素,这样做更有意义:

jQuery( elem )[0];
如果传递了jQuery对象,
jQuery(jQueryObject)
将以相同的顺序返回相同的元素。如果传递一个元素,则返回该元素。如果传递jQuery对象,则将返回其中的第一个元素。如果传递选择器,则返回DOM中的第一个匹配项


我们在jQuery UI中使用了类似的技术,基本上解决了您在选项中传递给小部件的任何选择器/元素/jQuery对象。

jQuery不能比底层JavaScript引擎本身更聪明。这比jQuery的
obj实例
更好吗?我认为OP的解决方案更好;立即就可以清楚地知道正在评估的是什么(并且不太容易出错)。我理解这个问题是在询问一种替代
语法的方法。
instanceof
在跨帧环境中工作时遇到困难,实际上,
obj[0]
而不是
obj.get(0)
是我对这个主题的唯一建议。这很有意义,而且更简洁,尽管行为并不完全相同。此方法将为有效的选择器字符串返回DOM对象,或为无效的选择器字符串返回
undefined
。另一个方法将返回字符串参数本身。