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

Is id="nodeName" reserved in html5?

本文关键字:保留 html5 是否 nodeName id      更新时间:2023-09-26

我正在使用:

<span id="nodeName"></span>

在我的 HTML 中,然后让 jQuery 做:

$("#nodeName").html("someString");

然后,控制台说:

Uncaught TypeError: Object #<HTMLSpanElement> has no method 'toLowerCase' 

我更改 id 后,它工作正常。那么,是否有任何保留 ID?

不,几乎任何字符串都是有效的 ID。这只有在你包含jQuery(1.xx版本,而不是2.xx版本(时才会发生。

更多详情 :

  • 代码工作,如"它更改内部HTML">
  • 一旦你包含了jQuery,即使你不使用它,你也会在acceptData中出现错误,当DOM准备好时,但在你传递给$(document).ready的回调被执行之后。

这是一个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 === window.当你在页面中包含jQuery时,即使你从未在Javascript中选择该元素,也会调用它。

原因是jQuery会检查一下,一旦jQuery准备就绪,哪些元素可以处理data-attributes。在该检查期间,它会调用 window 元素上的 acceptData 函数。

这在最新版本的jQuery 1中,自版本1.8.0开始,直到并包括最新的1.10.1。该错误似乎是由jQuery 1.8中的以下更改引入的:

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

窗口在版本 1.8.0 中作为第 2939 行的cur传递到jQuery._data中,以检查窗口对象上的内部"事件"数据。当 jQuery 触发$(document).ready $(window).ready事件时,就会发生这种情况。由于窗口不是 DOM 节点,因此根本不应该在窗口上调用数据。

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

我创建了一个错误报告