【发布时间】:2014-09-02 06:39:45
【问题描述】:
在每个 jQuery 事件中,jQuery 提供了 currentTarget,它与 this 相同,但据我了解,currentTarget 的属性取决于您的浏览器。
在 chrome 中,我可以得到 event.currentTarget.dataset,它为我提供了启动事件的元素的数据,但我认为这不适用于所有浏览器。我知道的唯一跨浏览器解决方案是通过将 currentTarget 包装在另一个 jQuery 对象中来获取数据,如下所示。
var div = jQuery("<div/>").data("numbers", [1,2,3]);
div.click(function(e) {
var data = jQuery(e.currentTarget).data();
console.log(data.numbers);
});
有没有人知道一个跨浏览器的解决方案来获取数据而无需使用this/currentTarget 创建一个新的 jQuery 对象?
更新:只是为了清楚说明我问的原因:
我们再次将触发事件的元素转换为 jQuery 对象,通过 jQuery 再次发送它(它已经是用于创建事件的 jQuery 对象)。我希望有一种方法可以将已经创建的 jQuery 对象带入事件中。 this presentation 上的幻灯片 44 和 45 解释了我的思考过程。
您可以使用event.currentTarget.dataset 执行此操作,但我认为它不是跨浏览器解决方案。在上面的代码中,您可以使用缓存的 jQuery 对象 div 来获取数据,而无需重新创建 jQuery 对象。这适用于该特定示例,但是您将如何处理像下面的 delegate 事件这样的动态事件:
jQuery("#container").on('click', '.pop-data', function(e) {
var data = jQuery(e.currentTarget).data();
alert(data);
});
上面的代码可以运行并且不是一个糟糕的解决方案,但是有谁知道在不创建新的 jQuery 对象的情况下获取数据的方法吗?
【问题讨论】:
-
您为什么想要不同的解决方案?
-
坚持使用 jQuery 的编写方式有什么问题?
-
@arun 性能。它是一个插件。
-
jQuery 被构建为使用
this来引用自我......重写这个有什么意义?特别是如果您担心浏览器兼容性 - 这就是编写 jQuery 的原因之一! -
我不认为使用 jQuery 数据 api 会导致相当大的开销..
标签: javascript jquery jquery-data