Javascript JQuery不过滤DOM更改

Javascript JQuery不过滤DOM更改,javascript,jquery,html,dom,Javascript,Jquery,Html,Dom,我有一个调查问卷页面,一些div有一个数据回答属性,如下所示: <div class="question" data-answered="False"> ... rest of the html </div> var answeredCount = $('[data-answered=True]').length 请假设我有办法得到实际的div,这不是问题所在。现在我可以看到,当我检查js局部变量时,实际的数据应答属性设置为“True”,但是DOM资源管理器没有

我有一个调查问卷页面,一些
div
有一个
数据回答属性,如下所示:

<div class="question" data-answered="False">
   ... rest of the html
</div>
var answeredCount = $('[data-answered=True]').length
请假设我有办法得到实际的
div
,这不是问题所在。现在我可以看到,当我检查js局部变量时,实际的
数据应答
属性设置为
“True”
,但是DOM资源管理器没有显示任何内容。然而,当我需要回答问题时,问题就来了,答案如下:

<div class="question" data-answered="False">
   ... rest of the html
</div>
var answeredCount = $('[data-answered=True]').length
然后,无论我做了多少更改,我总是使用与第一次加载页面时相同的元素/结果/计数。但是,如果我执行以下操作:

var answeredCount = $('[data-answered]')
      .filter(function () { return $(this).data('answered') == 'True' })
      .length
然后我得到了我期望的结果。我将在实际的浏览器上添加一个包含一些数据的图像,以证明我刚才所说的支持我的主张:

注意:这一行为似乎发生在Opera和Edge上,因为我在Chrome上试用过它,它的工作方式和我预期的一样,但没有试用Firefox

这是预期的行为吗?
我是否误解了JQuery如何与DOM一起工作以及它的变化
是不是只有这两种浏览器让它们与众不同

要处理
数据-
属性,应使用方法设置属性。像这样:

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

这是因为将数据存储到内部jQuery位置,并且不会向DOM添加
data-
属性

另一方面,要检索数据,
.data(key)
都会返回分配了
.data(key,value)
数据-
属性的数据。从文档中:

在指定的数据存储中返回 jQuery集合,由数据(名称、值)或HTML5数据集设置-* 属性


要处理
数据-
属性,应使用方法设置属性。像这样:

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

这是因为将数据存储到内部jQuery位置,并且不会向DOM添加
data-
属性

另一方面,要检索数据,
.data(key)
都会返回分配了
.data(key,value)
数据-
属性的数据。从文档中:

在指定的数据存储中返回 jQuery集合,由数据(名称、值)或HTML5数据集设置-* 属性


使用原始javascript,您可以通过以下代码实现所需的结果。 可能是因为用“真”而不是“真”进行比较而出现问题

var ans=Array.from(document.getElementsByClassName(“问题”)).filter(e=>(e.dataset.answered='True')).length
/*
*
*如果您的浏览器不支持ES6语法
*Array.from(document.getElementsByClassName(“问题”)).filter(函数(e){returne e.dataset.answered=='True'}).length
* 
*/
document.getElementById('responsed').innerHTML=ans

... html的其余部分

... html的其余部分
... html的其余部分
... html的其余部分
... html的其余部分
... html的其余部分
... html的其余部分
答复:


使用原始javascript,您可以通过以下代码实现所需的结果。 可能是因为用“真”而不是“真”进行比较而出现问题

var ans=Array.from(document.getElementsByClassName(“问题”)).filter(e=>(e.dataset.answered='True')).length
/*
*
*如果您的浏览器不支持ES6语法
*Array.from(document.getElementsByClassName(“问题”)).filter(函数(e){returne e.dataset.answered=='True'}).length
* 
*/
document.getElementById('responsed').innerHTML=ans

... html的其余部分

... html的其余部分
... html的其余部分
... html的其余部分
... html的其余部分
... html的其余部分
... html的其余部分
答复:


似乎一切都很顺利

你可以查一下文件


简而言之,
$(…).data('answered','True')
不会将属性
data answered=“False”
更改为
data answered=“True”
<代码>$(…).attr('data-responsed','True')
确实如此。

似乎一切都进展顺利

你可以查一下文件

简而言之,
$(…).data('answered','True')
不会将属性
data answered=“False”
更改为
data answered=“True”
<代码>$(…).attr('data-responsed','True')
执行