Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么可以';不能按顺序删除样式吗?_Javascript - Fatal编程技术网

Javascript 为什么可以';不能按顺序删除样式吗?

Javascript 为什么可以';不能按顺序删除样式吗?,javascript,Javascript,我修改了下面SO帖子中的问题/答案,以删除样式,按前进顺序 问题/答案按相反顺序删除脚本 它不起作用。然而,如果我把它改回相反的顺序,事情就成功了 我的猜测是,如果删除style[0],则style[1]将立即更新为style[0],在示例中,只有两种样式。因此,循环将失败 这是正确的吗 样式数组是否在修改时几乎同时更新 你的猜测是正确的getElementsByTagName返回一个实时“数组”(它实际上不是数组,而是一个节点列表或HTMLCollection,具体取决于浏览器和版本),反映

我修改了下面SO帖子中的问题/答案,以删除样式,按前进顺序

问题/答案按相反顺序删除脚本

它不起作用。然而,如果我把它改回相反的顺序,事情就成功了

我的猜测是,如果删除
style[0]
,则
style[1]
将立即更新为style[0],在示例中,只有两种样式。因此,循环将失败

这是正确的吗

样式数组是否在修改时几乎同时更新


你的猜测是正确的
getElementsByTagName
返回一个实时“数组”(它实际上不是数组,而是一个
节点列表
HTMLCollection
,具体取决于浏览器和版本),反映对DOM的后续更新

所以,你可以写:

var styles = document.getElementsByTagName("style");
while (styles.length) {
    styles[0].parentNode.removeChild(styles[0]);
}
也就是说,没有理由选择这种方式。由于JavaScript在绘制UI的同一线程中运行,因此在循环完成之前,删除样式的结果不会生效,因此顺序对您来说并不重要

有用的MDN链接:

来自:

elements是一个活动节点列表(但请参见下面的注释),它按元素在子树中出现的顺序列出已找到的元素。如果未找到任何元素,则节点列表为空

因此,一旦删除元素[0],元素[0]就会被元素[1]填充,从而删除元素[1](除非存在元素[2])

您可以像这样按“正常”顺序执行(尽管由于对scripts.length的重复测试,性能不如以前):


当然,HTMLCollection确实是实时的,但这只适用于某些DOM方法(这本身就相当混乱)。我认为您的猜测是正确的,但您在问题中加入了
样式
,在代码中加入了
脚本
,您打算使用哪一种?或者你想要两个都像那样?可能是重复的
var styles = document.getElementsByTagName("style");
while (styles.length) {
    styles[0].parentNode.removeChild(styles[0]);
}
var scripts  = document.getElementsByTagName("script");
while (scripts.length) {
    (scripts[0]).parentNode.removeChild(scripts[0]);
}