Javascript 为什么Microsoft Edge会在呈现页面之前对html属性重新排序?

Javascript 为什么Microsoft Edge会在呈现页面之前对html属性重新排序?,javascript,html,microsoft-edge,Javascript,Html,Microsoft Edge,因此,我编写了一些Javascript,当用户单击按钮时,会滚动到文档上的某个位置: document.getElementById("navContact").addEventListener("click", scrollToSection); function scrollToSection() { /* this = element on which the user clicked */ smoothScroll(this.attributes[0].value.sp

因此,我编写了一些Javascript,当用户单击按钮时,会滚动到文档上的某个位置:

document.getElementById("navContact").addEventListener("click", scrollToSection);

function scrollToSection() {
    /* this = element on which the user clicked */
    smoothScroll(this.attributes[0].value.split("#")[1]);
}
它很好,简单,易于阅读和调试。唯一的问题是,它通过从命名节点映射读取它必须滚动到的节的名称。在我的标记中,属性的顺序如下:

<a href="#contact_us" id="navContact"></a> 
<--! document.getElementById("navContact").attributes = [href="contact_us", id="navContact"] -->
但当我在Edge的DOM资源管理器中选中此项时,属性会重新排序:

<a id="navContact" href="#contact_us"></a>
<--! document.getElementById("navContact").attributes = [id="navContact", href="contact_us"] -->
根据Josiah Keller的建议,我将js更改为使用element.getAttribute而不是this.attributes


与此同时,我非常想知道,Edge为什么要这样做?

为什么不使用el.getAttribute'href'呢?

为什么不使用el.getAttribute'href'呢?

.attributes返回NamedNodeMap.:

NamedNodeMap接口表示Attr对象的集合。 NamedNodeMap中的对象不按任何特定顺序排列,这与 节点列表,尽管它们可以像在数组中一样通过索引访问

虽然您可以使用此.attributes[0]引用它,但您会注意到,由于它不是数组,因此无法推送到它。它是一个对象,它的构造没有考虑到顺序,因此它可能不是Edge中的bug。它仍然返回它应该返回的东西,这是一个无序的对象

正如其他人所建议的,您应该只获取href,但希望这能解释为什么它不能像您所想的那样工作。

.attributes返回一个NamedNodeMap

NamedNodeMap接口表示Attr对象的集合。 NamedNodeMap中的对象不按任何特定顺序排列,这与 节点列表,尽管它们可以像在数组中一样通过索引访问

虽然您可以使用此.attributes[0]引用它,但您会注意到,由于它不是数组,因此无法推送到它。它是一个对象,它的构造没有考虑到顺序,因此它可能不是Edge中的bug。它仍然返回它应该返回的东西,这是一个无序的对象


正如其他人所建议的,您应该只获取href,但希望这能解释为什么它没有像您所想的那样工作。

…为什么不使用getAttribute读取属性?至于为什么它没有保留顺序,我猜它们只是存储在某种为快速访问而优化的数据结构中。订单不重要,谢谢。有太多的方法,我忘了我可以这么做……为什么不使用getAttribute读取属性呢?至于为什么它不能保持顺序,我猜它们只是存储在某种为快速访问而优化的数据结构中。订单不重要,谢谢。方法太多了,我忘了我可以这么做。attributes属性返回的是NamedNodeMap,而不是列表。还有一个顺序是:让名称作为此NamedNodeMap对象的属性列表中属性的限定名称,并按顺序省略重复项。。因此,会推断出一个顺序,并且该顺序可能应该与它所基于的顺序相同。我不认为重新排序是将属性放置到命名节点映射中的副作用。这种行为在Chrome或Firefox中不会发生。元素总是以相同的顺序出现-只是不是我的顺序。@RobG:DOM规范,不是HTML规范。哈,很有趣。以前的DOM规范都明确表示,NamedNodeMap无法保证顺序,但现在该文本已从现行规范中删除。或者,它从未出现在TWG的DOM愿景中…?@BoltClock是的,对不起,应该滚动到顶部。;-如果他们按顺序说,应该有一些东西说明顺序是什么。由于ECMAScript对象没有任何顺序,甚至数组属性也没有任何顺序,因此无法保证for..in将首先返回名为0的属性,IE的某些版本没有。他们可能仍在研究如何定义它。拼写错误已修复。谢谢,@RobG.attributes属性返回NamedNodeMap,而不是列表。还有一个顺序是:让名称作为此NamedNodeMap对象的属性列表中属性的限定名称,并按顺序省略重复项。。因此,会推断出一个顺序,并且该顺序可能应该与它所基于的顺序相同。我不认为重新排序是将属性放置到命名节点映射中的副作用。这种行为在Chrome或Firefox中不会发生。元素总是以相同的顺序出现-只是不是我的顺序。@RobG:DOM规范,不是HTML规范。哈,很有趣。以前的DOM规范都明确表示,NamedNodeMap无法保证顺序,但现在该文本已从现行规范中删除。或者,它从未出现在TWG的DOM愿景中…?@BoltClock是的,对不起,应该滚动到顶部。;-如果他们按顺序说,应该有一些东西说明顺序是什么。因为ECMAScript对象没有任何顺序
n数组属性不按任何顺序排列,无法保证for..in将首先返回名为0的属性,IE的某些版本可能仍在研究如何定义它。拼写错误已修复。谢谢,罗伯。