- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个要求,我必须在容器中获取最后一个 .div
并对其应用一些业务逻辑。最后一个 .div
的选择必须是动态的,因为用户可以选择添加/删除 .div
元素。
最初我尝试使用 querySelectorAll
但它似乎没有用。所以我决定将其更改为 getElementsByClassName
并且令人惊讶的是它使用相同的逻辑。有人可以帮我解释为什么 remove_div
不起作用而第二个 (remove_div_2
) 起作用吗?
注意:我不是在寻找问题的修复/解决方案,因为我已经进行了第二个选项。我只想知道带有 querySelectorAll
的选项不起作用的原因。
下面是我的代码:
HTML:
<div id='container'>
<div id='div1' class='div'>This is Div 1</div>
<div id='div2' class='div'>This is Div 2</div>
<div id='div3' class='div'>This is Div 3</div>
</div>
<button type='button' id='append_div'>Append Div</button>
<button type='button' id='remove_div'>Remove Div</button>
<button type='button' id='remove_div_2'>Remove Div 2</button>
JavaScript:
window.onload = function () {
var elementToStyle = document.querySelectorAll("#container .div");
elementToStyle[elementToStyle.length - 1].classList.add('red');
document.getElementById('append_div').onclick = function () {
var divToInsert = document.createElement('div');
divToInsert.id = 'new_div';
divToInsert.className = 'div';
divToInsert.innerHTML = 'This is an appended div';
document.getElementById('container').appendChild(divToInsert);
var elToStyle = document.querySelectorAll("#container .div");
for (i = 0; i < elToStyle.length; i++)
elToStyle[i].classList.remove('red');
elToStyle[elToStyle.length - 1].classList.add('red');
};
document.getElementById('remove_div').onclick = function () {
var elToStyle = document.querySelectorAll("#container .div");
document.getElementById('container').removeChild(elToStyle[elToStyle.length - 1]);
elToStyle[elToStyle.length - 1].classList.add('red');
};
document.getElementById('remove_div_2').onclick = function () {
var elToStyle = document.getElementsByClassName('div');
document.getElementById('container').removeChild(elToStyle[elToStyle.length - 1]);
elToStyle[elToStyle.length - 1].classList.add('red');
};
}
最佳答案
原因是因为 querySelectorAll
方法返回一个静态列表。使用 querySelectorAll
后对文档所做的任何更改(如本例中的 removeChild
)都不会反射(reflect)在返回的节点列表中。因此 elToStyle[elToStyle.length - 1]
仍将指向已删除的节点。
然而,另一方面,getElementsByClassName
返回一个事件的节点列表。这意味着 elToStyle[elToStyle.length - 1]
将始终指向最后一个 .div
而不管在准备节点列表后是否对文档进行了任何更改.
以下是可用官方文档的摘录 here
The NodeList object returned by the querySelectorAll() method must be static, not live ([DOM-LEVEL-3-CORE], section 1.1.1). Subsequent changes to the structure of the underlying document must not be reflected in the NodeList object. This means that the object will instead contain a list of matching Element nodes that were in the document at the time the list was created.
注意:您可以通过在 removeChild
之前和之后执行 console.log(elToStyle);
来查看这一点。
关于javascript - querySelectorAll 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18735188/
我有以下内容: var searchSuggestionsItems = document.querySelectorAll("#search-user-results .live-search-re
我正在尝试查找具有以下内容的元素: doc.querySelectorAll('#divContentList article'); 它运行良好,但另一位开发人员告诉我我应该写: doc.queryS
尝试在错误控制台中执行这 2 个代码块: 第一个。输出节点列表。 var selector = "*[data-type=day][data-day='23']"; var a = document.
这是我的 JavaScript 代码: function answer(){ var list = document.querySelectorAll("#fish"); list[1].onclic
假设我有: ... ... ... ... ... ... ... 如何选择 元素,但仅限于 testimonials-wrapper 内的元素 尝试过:d
我创建了一个表,我们将其命名为 RPT_ACCOUNTS 代码|描述|类型01|银行|BA02|税|TA 当我从数据表中提取信息时,我会在 html 中直观地创建表格 row.dataset.rpt_
document.querySelectorAll('#salary-min, #salary-max').addEventListener('input', event => event.tar
这个问题已经有答案了: What do querySelectorAll and getElementsBy* methods return? (12 个回答) 已关闭 2 年前。 javaScrip
为了简单起见,我有以下 html,它不是我编写的,我无法控制。 我正在尝试为我们的职员编写一个脚本,该脚本必须将数据输入到此 Web 界面,以便她可以将数据从 Excel 复制并粘贴到 Web
我的代码有问题。现在,如果我单击第一个元素,所有元素将变为红色,如果我第二次单击它们将变为绿色。我想为 fa-heart 类的每个元素设置两个独立的事件。我会更好地解释:如果我第一次点击第一个元素 D
我已经创建了简单的 html 表单,我想使用 javascript 为输入字段标签设置动画。我使用 querySellectorAll 方法来识别对象,并使用控制台记录 querySelectorAl
我目前正在尝试适应this demo当您单击应用了相同类的链接时,用于页面转换。 我不确定如何在使用 querySelectorAll 后为具有相同类的所有元素调整以下代码。您认为应该进行哪些调整才能
我目前正在尝试适应this demo当您单击应用了相同类别的链接时,可以实现页面转换。目前,在 @ourmaninamsterdam 的推荐 here 后,我有以下代码:但我似乎无法让它发挥作用。您对
var arr = [].slice.call(document.querySelectorAll("a[href*='pricing']")); 返回一个长度为6的数组。 var arr = [].
我在 querySelectorAll 方面遇到问题。 这是我的代码: $(window).load( function() { // Add animations
在 JavaScript 中使用 :checked 选择器 document.querySelectorAll() 时,我发现存在不一致的行为。当 :checked 选择器用于复选框或单选按钮时,它不
我有一个表单,其中有多个选择框和带有类似名称的数组的输入。所以我有多个名称为 personroom[] 的选择框。我想用这个得到这些 var personroom=document.querySel
不确定这是否是导致我的项目出现错误的原因。 所以我有一堆具有相同类的 div,我通过选择它们 var CampaignInfo = document.querySelectorAll(".campai
假设我有以下标记... 无论如何,我可以使用 querySelectorAll 选择它们吗? 我尝试过 document.querySelectorAll([data-namespace-*])
我想使用 querySelectorAll 获取页面上多个下拉列表的选定值,然后将它们打印在页面上的其他位置。 我正在努力寻找正确的方法来执行此操作,因为它们都有不同的名称(“dropDown[0]”
我是一名优秀的程序员,十分优秀!