在html5中保留id =“nodeName”吗?

时间:2013-06-26 19:41:51

标签: javascript jquery html

我正在使用:

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

在我的html中,然后让jquery执行:

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

然后,控制台说:

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

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

2 个答案:

答案 0 :(得分:16)

不,almost any string is a valid ID。这只有在你包含jQuery(1.xx版本,而不是2.xx版本)时才会发生。

更多详情:

  • 代码有效,如“它更改innerHTML”
  • 一旦你包含了jQuery,即使你不使用它,你在acceptData时出现错误,当dom准备就绪时,但是在你回传到$(document).ready之后的回调被执行了

这是一个jQuery错误。为什么它发生似乎是由于window.nodeName被定义为此元素(没有toLowerCase方法,因为它是一个元素),因为具有此id的元素存在。在jQuery 2.02中似乎没问题。

答案 1 :(得分:10)

以下功能失败:

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。这个bug似乎是由jQuery 1.8中的以下更改引入的:

  

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

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

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

I created a bug report