【发布时间】:2015-06-29 15:25:19
【问题描述】:
jQuery 处理interesting way 中的数据属性,其中它检索值一次 并且在该点之后不观察更改或删除。数据的修改是通过使用 jQuery 的各种函数来实现的——$element.data('key', 'val') 等。因此,它会混淆代码来执行$element.prop('data-key', 'val') 和$element.removeProp('data-key', 'val') 之类的操作,因为这不接触 jQuery 数据API,尽管这些调用似乎是为了这样做。
然而,改变 DOM 的方法似乎是为委托事件侦听器成功使用数据属性的唯一方法“jQuery 方式:”
$element.on('click', '[data-key=val]', function(e) {
// only triggers on children of $element that have the DOM attribute
// data-attribute data-key, with a value of val
});
数据属性不会阻塞类名等,并且似乎是放置某些元素属性以供 JavaScript 使用的合理位置。但是现在如果我写$element.find('div').data('key', 'val'),这些元素在点击时将不符合条件。实现这一目标的唯一方法是说 $element.find('div').prop('data-key', 'val'),据我了解,这不是最佳做法。
另一个选项是这样的:
$element.on('click', 'div', function(e) {
if ($(this).data('key') != 'val') return;
// handle
});
这看起来很笨拙,并且会比上述更频繁地触发。我们的实际目标也不太清楚。
如果没有授权,我可以写:
$element.find('div')
.filter(function() { return $(this).data('key') == 'val'; })
.on('click', function(e) {
// handle
});
但.filter() 不适用于仅接受字符串选择器的委托侦听器。
所以问题是这样的:我已经有多种解决方案,但没有一个是理想的,也没有一个真正遵循 jQuery 的习惯用法。如何根据 jQuery Data API 分配委托侦听器?
【问题讨论】:
-
什么是应用程序,预期结果?
-
我不知道如何更清楚地解释它?我想应用一个基于 jQuery Data 的委托事件侦听器,它可能会发生变化。例如,我添加了一个 div,我不希望它可点击;发生其他事情,我申请
$div.data('clickable', true)。现在我希望它可以根据原始事件侦听器进行点击。 -
尝试使用
Element.dataset;见帖子。
标签: javascript jquery events jquery-data