我经常需要在循环中向多个 HTML元素(例如change
,click
)注册单用途事件监听器 。
我需要一种方法来在事件触发时区分目标元素。理想情况下,监听器应该有一个变量,该变量根据触发事件的元素而变化。
直接的解决方案是在循环中设置id
属性(jsfiddle),并在处理程序中引用this.id
。或者,如果需要其他字段,则为data-*
属性,而是访问this.dataset.id
。
然而,这些最终会添加到页面的实际标记中,并且只能存储字符串。如果要分配大量数据,除了字符串之外的特定类型,它可能是不切实际的,并且需要不必要的类型检查或整数解析。
我通过在每个HTML元素上定义一个名为param
的新属性来解决这个问题,我可以在处理程序中访问它,如下所示:this.param.address
。但turns out是bad idea - 一个'功能'由于浏览器的一致性而缺乏任何标准,所以不要依赖它。
另一种方法是通过闭包(jsfiddle)向监听器提供参数。这种方法的缺点是它为每个元素返回一个唯一的侦听器,这可能会影响性能而不仅仅是一个处理程序。
我想到的另一种方法是将实际的元素引用与数据存储在一个数组中,并从事件处理程序(JSFiddle)执行this
的查找。
所以我的问题是:是否有更好的(正确的/面向未来的)方法来传递/分配数据到元素事件处理程序,而不必将其存储为属性字符串?
P.S。我也不想依赖jQuery。
使用jQuery,可以使用$(el).bind("click", {foo:i}, buttonClicked)
和$.data(el, "param", {foo:i})
来完成任务。但是,它似乎依赖于能够为元素的对象设置自定义属性,这就是我建议将param
用作我的目的的自定义属性。这是否意味着只要属性名称足够独特就可以了?...