javascript - JQuery 不过滤 DOM 更改

标签 javascript jquery html dom

我有一个调查问卷页面,一些 div 添加了 data-answered 属性,如下所示:

<div class="question" data-answered="False">
   ... rest of the html
</div>

现在我有几个这样的东西,在某些时候,通过 js (你可以阅读 JQuery)我这样做:

myDiv.data("answered", "True")

请假设我有办法获取实际的 div 这不是这里的问题。现在,当我检查 js 局部变量时,我可以看到实际的 data-answered 属性设置为 "True",但 DOM 浏览器什么也没显示。然而,当我需要回答的问题计数如下时,问题就出现了:

var answeredCount = $('[data-answered=True]').length

然后,无论我做了多少更改,我总是与页面首次加载时相同的元素/结果/计数。但是,如果我执行以下操作:

var answeredCount = $('[data-answered]')
      .filter(function () { return $(this).data('answered') == 'True' })
      .length

然后我得到了我期望的结果。我将在实际浏览器上添加带有一些数据的图像,以证明我刚才所说的支持我的主张:

enter image description here

注意:这种行为似乎发生在 Opera 和 Edge 上,因为我在 Chrome 上尝试过并且它按我的预期工作,还没有尝试过 Firefox。

这是预期的行为吗?
我是否误解了 JQuery 如何与 DOM 一起工作及其变化?
难道只有这两种浏览器的特殊之处吗?

最佳答案

要处理 data- 属性,您应该将其设置为 .attr方法。像这样:

myDiv.attr("data-answered", "True")

现在,$('[data-answered=True]') 应该可以工作了。

那是因为.data()将数据存储到内部 jQuery 位置,并且不会将 data- 属性添加到 DOM。

另一方面,要检索数据,.data(key) 都返回使用 .data(key,value)data- 分配的数据。 属性。来自文档:

Return the value at the named data store for the first element in the jQuery collection, as set by data(name, value) or by an HTML5 data-* attribute.

关于javascript - JQuery 不过滤 DOM 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41734491/

相关文章:

javascript - 特殊字符前换行

javascript - KineticJS 如何从图层获取颜色(来自图层的颜色选择器)

javascript - 将类添加到 jQuery draggable and droppable 中的可放置项目

javascript - 使用 jQuery 替换最后一个逗号?

javascript - jquery - .hide() .show() 破坏 CSS 样式

jQuery 用文本框替换元素

html - IE10 中的 HTML <pre> 标签中的空行被删除

javascript - DIV 坚持到顶部,直到被下一个 DIV 推到屏幕外

javascript - 当从下拉列表中选择特定值时发出警报

javascript - 从 bootstrap-datetimepicker 获取日期作为字符串