如何比较两个jQuery对象的身份(identity)?

39

我正在尝试使用jQuery在网页上打开/关闭控制'盒子'。不幸的是,如果用户恰好单击已经打开的控件,则关闭一个控件再重新打开它看起来并不好看 (盒子是相互排斥的)。

我正在使用的代码无法正常工作,我不确定原因。仍然会出现关闭一个盒子再重新打开它的情况,这并不是期望的功能。 我创建了“val”变量进行调试;在调试器中,它显示“val”具有与$(this)完全相同的值,这应该防止它进入if语句中的.slideToggle(),但实际上没有。

function openBox(index)
{
  val = $('#box' + index);
  $('.profilePageContentBox').each(function(){
      if($(this).css('display') != 'none')
      {
        if($(this) != val)
        {
          $(this).slideToggle(200);
        }
      }
    });
  val.slideToggle(200);
}

你可能也想看看这个:https://dev59.com/dHE95IYBdhLWcg3wJKh_ - GnrlBzik
3个回答

87

你还可以这样做:

 if(val.is(this))

1
简单明了。非常好的答案。 - Brandon
2
最佳答案在这里。赞! - m1.
Object.is() 方法确定两个值是否为相同的值,这是正确答案,也是你用赤手空拳捕鱼的方法 :D - Kim Steinhaug

52

使用$()函数总是会创建一个新的对象,所以无论如何,你的相等性检查将始终失败。

例如:

var div = document.getElementById('myDiv');

$(div) === $(div);   // false!

相反,你可以尝试仅存储实际的DOM元素,因为这些元素只是在jQuery对象内部被引用。

val = $('#box'+index).get(0);
...
if (this !== val) { }

8
谢谢!一旦 StackOverflow 允许我,我将接受这个答案。你不仅回答了问题本身,还解释了让我困惑的概念性缺陷--“授人以鱼不如授人以渔”。 - RonLugge
4
这个人教你如何使用钓竿钓鱼(平庸),而下面的答案则教你如何用手抓鱼(霸气)! - Dylan Hayes

0

试试这个:

function openBox(index)
{
val=$('#box'+index);
$('.profilePageContentBox').each(function(){
    if($(this).is(":visible"))
    {
        if(!$(this).is("#box"+index))
            $(this).slideToggle(200);
    }
});
val.slideToggle(200);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接