Javascript 多事件侦听器使用:为每个元素分配唯一的数据?

Javascript 多事件侦听器使用:为每个元素分配唯一的数据?,javascript,javascript-events,event-handling,Javascript,Javascript Events,Event Handling,我经常需要注册一个单一用途的事件监听器,以循环方式将其注册到多个HTML元素(例如,change,click)。 我需要一种在事件触发时区分目标元素的方法。理想情况下,侦听器应该有一个变量,该变量根据触发事件的元素而变化 一个简单的解决方案是在循环()中设置id属性,并在处理程序中引用this.id。或者,如果需要其他字段,则输入属性,而不是访问this.dataset.id 但是,它们最终会添加到页面的实际标记中,并且只能存储字符串。如果要分配大量的数据,而这些数据是字符串以外的特定类型,那么

我经常需要注册一个单一用途的事件监听器,以循环方式将其注册到多个HTML元素(例如,
change
click
)。 我需要一种在事件触发时区分目标元素的方法。理想情况下,侦听器应该有一个变量,该变量根据触发事件的元素而变化

一个简单的解决方案是在循环()中设置
id
属性,并在处理程序中引用
this.id
。或者,如果需要其他字段,则输入属性,而不是访问
this.dataset.id

但是,它们最终会添加到页面的实际标记中,并且只能存储字符串。如果要分配大量的数据,而这些数据是字符串以外的特定类型,那么这可能是不切实际的,需要进行不必要的类型检查或整数解析

我通过在每个HTML元素上定义一个名为
param
的新属性来解决这个问题,我可以像这样在处理程序中访问它:
this.param.address
。但是,由于浏览器的一致性以及任何标准中都缺乏这一特性,这将是一个不可依赖的“特性”

另一种方法是通过闭包()向侦听器提供参数。此方法的缺点是,它为每个元素返回一个唯一的侦听器,这可能会影响性能,而不仅仅是单个处理程序

我想到的另一种方法是将实际的元素引用和数据存储在一个数组中,并从事件处理程序()中执行
this

因此,我的问题是:是否有更好的(正确的/未来的)方法将数据传递/分配给元素事件处理程序,而不必将其存储为属性字符串?

另外,我也不想依赖jQuery


使用jQuery,可以使用
$(el).bind(“单击“,{foo:i},按钮单击)
$.data(el,“参数”,{foo:i})
来完成任务。然而,它似乎依赖于能够为元素的对象设置一个自定义属性,这正是我建议将
param
用作自定义属性的目的。这是否意味着只要属性名称足够唯一就可以了

您认为有什么可能比在每个元素上引用自定义属性更有效?除非您可以从DOM中单击元素的父/子元素推断出您需要知道的任何信息,否则自定义属性是首选解决方案。如果这是通过编程生成的数据,则在分配事件处理程序时将其放入闭包中。如果您不显示数据的实际外观以及如何使用它,我们将无法更具体地说明。类似于?@jfriend00示例:循环中的7个复选框将分配给此对象:
{type:“bitfield”,bitno:j,address:i}
。我想要JS对象的灵活性。单击每个复选框时,它知道其类型、地址和位号。HTML属性将所有内容转换为字符串,这在处理其他类型时并不理想。我不想在标记中的每个元素上都添加三个属性。自定义属性可以是JSON,您可以将其解析为任何形式。既然我们不知道这些自定义数据来自哪里,如果它不在HTML中,那么我们真的不知道如何使用它。你只是没有充分表现出这个问题。唯一通用的答案是将自定义数据放入HTML中。除此之外,我们还需要知道数据来自何处,以及您正在尝试如何处理这些数据。基本上,你问的问题过于理论化,没有足够的背景。向我们展示您的实际代码和情况详细信息,我们可能会更有帮助。数据看起来像什么并不重要。只是我需要保留类型:number、null、undefined、booleans等,并将任意数量的类型分配给每个元素。不能使用属性。