【问题标题】:Unwrap safely jQuery instances to get the wrapped DOM element安全地解包 jQuery 实例以获取包装的 DOM 元素
【发布时间】:2013-01-15 17:13:38
【问题描述】:

使用 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 不能比底层 JavaScript 引擎本身更智能。

标签: javascript jquery dom


【解决方案1】:

Detect DOM object vs. jQuery Object 似乎包含了这个问题的答案。

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

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

【讨论】:

  • 这比obj instanceof jQuery 好多少?我认为OP的解决方案更好;它立即清楚正在评估什么(并且不易出错)。
  • 我理解这个问题是要求替代 intanceof 语法。
  • instanceof 在跨框架环境中工作时遇到问题,实际上,obj[0] 而不是obj.get(0) 是我对该主题的唯一建议。
【解决方案2】:

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

jQuery( elem )[0];

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

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

【讨论】:

  • 这是有道理的并且更加简洁,尽管行为并不完全相同。此方法将返回有效选择器字符串的 DOM 对象或无效选择器字符串的 undefined。另一种方法将返回字符串参数本身。
猜你喜欢
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
相关资源
最近更新 更多