Javascript id=“nodeName”是否在html5中保留?

Javascript id=“nodeName”是否在html5中保留?,javascript,jquery,html,Javascript,Jquery,Html,我正在使用: <span id="nodeName"></span> 然后,控制台说: Uncaught TypeError: Object #<HTMLSpanElement> has no method 'toLowerCase' 我换了身份证后,一切正常。那么,是否有任何保留id?否。只有在包含jQuery 1.xx版本而不是2.xx版本时才会发生这种情况 更多详情: 代码可以正常工作,因为它会更改innerHTML 一旦包含jQuery,即使不使

我正在使用:

<span id="nodeName"></span>
然后,控制台说:

Uncaught TypeError: Object #<HTMLSpanElement> has no method 'toLowerCase' 
我换了身份证后,一切正常。那么,是否有任何保留id?

否。只有在包含jQuery 1.xx版本而不是2.xx版本时才会发生这种情况

更多详情:

代码可以正常工作,因为它会更改innerHTML 一旦包含jQuery,即使不使用它,在dom就绪时,但在执行传递给$document.ready的回调之后,acceptData中就会出现错误。
这是一个jQuery错误。之所以会发生这种情况,似乎是因为window.nodeName被定义给这个元素,而这个元素没有toLowerCase方法,因为它是一个元素,而具有此id的元素存在。在jQuery 2.02中似乎还可以。

它在以下功能中失败:

acceptData: function( elem ) {
    // Do not set data on non-element because it will not be cleared (#8335).
    if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
        return false;
    }

    var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];

    // nodes accept data unless otherwise specified; rejection can be conditional
    return !noData || noData !== true && elem.getAttribute("classid") === noData;
}
特别是在调用elem.nodeName.toLowerCase时,当elem==窗口时。当您在页面中包含jQuery时,即使您从未在Javascript中选择该元素,也会调用它

原因是jQuery会进行检查,以查看在jQuery就绪后哪些元素可以处理数据属性。在该检查期间,它调用window元素上的acceptData函数

这在jQuery1的最新版本中有所体现,从1.8.0版到最新的1.10.1版。该错误似乎是由jQuery 1.8中的以下更改引入的:

$element.data“events”:在版本1.6中,jQuery将其内部数据与用户数据分离,以防止名称冲突。然而,有些人使用内部未记录的“事件”数据结构,因此我们仍然可以通过.data检索该数据。这在1.8中已经删除,但是您仍然可以通过$.\u数据元素events获取事件数据以进行调试。请注意,这不是受支持的公共接口;实际数据结构可能会因版本不同而发生不兼容的变化

为了检查窗口对象上的内部事件数据,在中的第2939行将窗口作为cur传递到jQuery.\u data。当jQuery触发$document.ready$window.ready事件时,就会发生这种情况。因为窗口不是DOM节点,所以根本不应该在窗口上调用acceptData

handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );

它不是保留的,但在某些浏览器中使用它可能会产生奇怪的副作用,因为nodeName也是javascript中节点的一个属性,在具有此功能的特定浏览器中,为元素指定一个id将自动在窗口和节点的父节点上为该id生成一个属性。@KevinB但它怎么会作为id出现问题?@Ian仅选择元素就足以导致错误,你甚至不必选择它@KevinB我明白,我相信OP和你都认为这会造成问题,我只是想知道为什么。仅供参考-当具有特定id的元素在窗口上设置属性时,它不会在其父节点上设置属性。你可能正在考虑设置一个好的答案!OP您应该向jQuery提交错误报告。顺便问一下,在jQuery 2中也会发生这种情况吗?不,我将对此进行表决,因为jQuery显然有一些问题。我想知道的是为什么会发生这种情况。当使用elem.nodeName时,jquery中的nodeName会失败,但这实际上不会导致这个问题,除非它在Windows上使用,而且Windows也没有nodeName。@dystroy我停止了投票,你上次投票是在7分钟前,你的投票现在被锁定了。它告诉我,我不能再投票了。如果可以的话我会的。啊,我明白了。事件被传播到窗口,此时它尝试接受窗口上的数据,但无法获取节点名。2.0.2是否支持旧的.onready语法?如果没有,那就解释了为什么它在2.0.2中正常工作,因为没有必要触发它。我也发现了这个,但不知道它是如何被调用的。您能否显示acceptData的调用位置/方式?我看到您正在尝试调试jQuery。你应该完全放下它然后。。。啊,去它的。+1当调用window.nodeName返回span元素时,问题就出现了,它应该在该元素中返回未定义的元素。我要在那里停下来,不再往前走了。
handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );