【问题标题】:How can I assign a delegated jQuery event listener based on values in jQuery's data API?如何根据 jQuery 的数据 API 中的值分配委托的 jQuery 事件侦听器?
【发布时间】: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


【解决方案1】:

尝试使用HTMLElement.dataset

$(document).on("click", "[data-clickable=true]", function(e) {
  alert(this.dataset.clickable)
});
// set `div` `dataset.clickable` to `true`
$("button").on("click", function() {
  $("div")[0].dataset.clickable = true;
  $("[data-clickable=true]").html("clickable: true")
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<button>make `div` "clickable"</button>
<div data-clickable="false">clickable: false</div>

jsfiddle http://jsfiddle.net/a7qcafwf/1/

【讨论】:

  • 这很有趣。 dataset 对 jQuery Data API 有影响吗?似乎没有。所以这似乎是另一种(更现代)的说法$('div').prop('data-clickable', true)
  • 查看链接文章 "进入 HTML5 几年后,HTML5 开始流行,并通过其 data-* 属性和相关的 DOM .dataset 属性将另一个概念与“数据”一词联系起来。这与 jQuery 最初的数据概念不太一样:它涉及与标记中的 HTML 元素相关联的值,而不是内存中的 DOM 元素。但它们在逻辑上足够接近,我们添加了读取 HTML5 data-* 属性的能力jQuery 的数据对象从 1.4 版本开始。” jQuery.data().data() 应该 读取更新的 html data-* 属性
  • 会查看当前jQuery.data.data()的源代码以确定原生HTMLElement.dataset是如何解析的,与jQuery实现相关;尽管使用 HTMLElement.dataset 来表示原始帖子中描述的应用程序类型。
  • 是的...我认为可能是长期的,.dataset 可以替换 $.data(),但在短期内它们不会相互更新(如前所述,jQuery只从 HTML 读取数据一次,这就是存储数据集信息的地方)。 .dataset 是 IE11+,这可能是最大的绊脚石。现在需要依赖$.data()
  • 是的。 Save for ieHTMLElement.dataset 似乎对此类实现很有用。见源github.com/jquery/jquery/blob/master/src/data.js。尚未尝试使用 .data()jQuery.data() 进行上述操作
猜你喜欢
  • 2014-12-15
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多