Javascript 如何在不指定ID的情况下测试HTML元素的唯一标识?

Javascript 如何在不指定ID的情况下测试HTML元素的唯一标识?,javascript,Javascript,我已经在JavaScript中使用以下代码好几个月了,它似乎可以正常工作,但我开始怀疑它为什么可以工作,以及它是否是一种安全的方法 其目的只是跟踪当前选定的HTML元素,如果用户再次单击当前选定的元素,则不会执行由事件触发的功能代码 function elem_mouse_evt( evt ) { if ( evt.currentTarget === elem_mouse_evt.e ) return; elem_mouse_evt.e = e

我已经在JavaScript中使用以下代码好几个月了,它似乎可以正常工作,但我开始怀疑它为什么可以工作,以及它是否是一种安全的方法

其目的只是跟踪当前选定的HTML元素,如果用户再次单击当前选定的元素,则不会执行由事件触发的功能代码

    function elem_mouse_evt( evt )
      {
        if ( evt.currentTarget === elem_mouse_evt.e ) return;
        elem_mouse_evt.e = evt.currentTarget;  
        /* ... */
      }
就我而言,这可能是一个相当愚蠢的问题,但为什么这与比较两个对象的等价性不同呢?JavaScript是如何进行这种比较的,因为每个都代表一组值

多谢各位

添加在考虑发布的答案时,我忽略了一个非常重要的问题,那就是函数属性
e
有更大的用途。用户可以选择对当前选择和/或其内容执行的操作菜单。我认为将引用存储在function属性中比遍历DOM通过其唯一属性搜索它更有效。这是一个合理的方法吗

其目的只是跟踪当前选定的HTML元素,如果用户再次单击当前选定的元素,则不会执行由事件触发的功能代码

    function elem_mouse_evt( evt )
      {
        if ( evt.currentTarget === elem_mouse_evt.e ) return;
        elem_mouse_evt.e = evt.currentTarget;  
        /* ... */
      }
我会以某种方式标记该元素,而不是执行您要求的操作(唯一地标识一个元素)。一种方法是向其
数据集添加一些内容。我猜您可能希望在某个时候更改此选定元素的样式,以便用户看到它已被选中。在这种情况下,我们将添加一个类

// Add an event listener on the container for these elements.
// It's more efficient to have just one event listener, rather than thousands.
document.querySelector('.parent').addEventListener('click', (e) => {
  // Ensure what's actually clicked meets the filter
  if (!e.currentTarget.matches('.selectable')) {
    return;
  }

  // If it's already selected, don't do anything else!  (You can combine this with above.)
  if (e.currentTarget.matches('.selected')) {
    return;
  }

  e.currentTarget.classlist.add('selected');
  // Perform your other actions here
});

请记住,变量指的是对象。如果您比较
a==b
,其中
a
b
是两个不同的对象(可能有相同的原型,也可能没有相同的原型),您只是比较这些对象的引用。感谢您回答我的问题。我意识到
elem\u mouse\u evt.e
不是
evt.currentTarget
的副本,但在考虑如何进行比较时,我甚至没有考虑到这一点。所以,这是一个愚蠢的问题。再次感谢。谢谢你回答我的问题。我可以使用你的任何一个建议,即
数据集
,因为我现在使用这两个。用户添加元素,我当时将一些值分配给
数据集
,用于indexedDB中的复合键以保存内容,并使新添加的元素成为所选元素,同时通过添加
对其进行样式设置。我可以将其中一个存储为函数属性,因为我还需要在其他地方引用它。但是在比较对象引用时是否有任何错误或低效的地方?感谢您关于将事件侦听器添加到父容器的说明。我没有考虑到这一点,一直在为用户添加的每个新元素添加一个侦听器。我甚至不得不添加一些代码,以便通过单击父元素而不是子元素来取消选择子元素。我认为您提到的方法可能会简化这一过程,并肯定会减少事件侦听器的总数。我忘记了包括一些重要的内容,这是当前选择需要跟踪的主要原因。有一个可以对所选元素或其内容执行的操作菜单。单击其中一个菜单按钮时,它通过引用
elem\u mouse\u evt.e
函数属性作用于所选元素,无需遍历DOM来定位它。有更好的方法吗?谢谢。@Gary假设您没有使用某些底层UI框架,更好的方法是将DOM作为记录源。以后,您无需花费任何时间即可创建一个
文档。queryselectoral()
并获取所有选定的元素,然后
[…元素].map()
将它们映射到您执行的任何操作所需的数据集属性。我想与大家分享,在这个项目上多做了几个月之后,将侦听器放置在父容器上的方法非常有效,尤其是当接口和选项变得更加复杂时。我的问题有点愚蠢,但你提供的信息很有价值。我认为这是一个很好的例子,说明了为什么问题不应该太快结束。有知识的人可能会提供一些意想不到的东西,比如不只是回答问题,而是确保提出了正确的问题,并教授更好的方法或方法。