【问题标题】:Why does $("body") == $("body") return false?为什么 $("body") == $("body") 返回 false?
【发布时间】:2011-05-18 01:01:26
【问题描述】:

为什么标题中的方程式是错误的?如何检查两个 jQuery 选择器是否指向同一个 DOM 对象?

【问题讨论】:

    标签: javascript jquery jquery-selectors


    【解决方案1】:

    您正在比较两个不同 jQuery 对象,因为您调用$() 两次(等式的每一边一次),并且as MooGoo explains jQuery 为您每次调用它创建新的包装器对象。这就是比较最终返回 false 的原因。

    您可以使用get() 或数组解引用从每个jQuery 对象中提取一个DOM 对象,然后比较这些元素。以下都返回 true,因为两个相同的选择器匹配相同的 body DOM 元素:

    $('body').get(0) == $('body').get(0)
    $('body')[0] == $('body')[0]
    

    如果您想针对 jQuery 选择器进行测试,请使用 is()。请注意,除非您的选择器是相同的,否则您使用的选择器可能不一定匹配相同的 DOM 元素(最好使用上面的)。这也返回 true:

    $('body').is('body')
    

    【讨论】:

    • 第一句只有在你已经知道 $() 函数创建 NEW 对象的情况下才清楚,所以 MooGoo 的回答解释性更强一些。如果我有function a() { return true; },那么a() == a() 是真的。
    • 如果上面不清楚,is 不会测试相等性,它会测试集合中是否至少有一个元素与给定的选择器匹配。例如$('#cb').is(':checked').
    【解决方案2】:

    因为 jQuery 为每个 $ 调用创建一个新的包装对象,并且在 Javascript 中所有对象都是不同的,即使它们具有完全相同的属性/方法。

    另一方面,document.body == document.body 的计算结果为 true

    【讨论】:

    • 您首先解释了包装对象的创建。 +1
    【解决方案3】:

    使用 $.is()

    http://api.jquery.com/is/

    根据选择器、元素或 jQuery 对象检查当前匹配的元素集,如果这些元素中至少有一个与给定参数匹配,则返回 true...

    与其他过滤方法不同,.is() 不会创建新的 jQuery 对象。相反,它允许您在不修改的情况下测试 jQuery 对象的内容。这在回调中通常很有用,例如事件处理程序...

    【讨论】:

    • 查看其他答案,了解为什么需要 $.is() 的实际解释。
    猜你喜欢
    • 2013-05-18
    • 1970-01-01
    • 2016-04-01
    • 2021-06-27
    • 2012-04-21
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    相关资源
    最近更新 更多