我正在使用:
<span id="nodeName"></span>
在我的html中,然后让jquery执行:
$("#nodeName").html("someString");
然后,控制台说:
Uncaught TypeError: Object #<HTMLSpanElement> has no method 'toLowerCase'
更改ID后,它可以正常工作。那么,是否有任何保留ID?
答案 0 :(得分:16)
不,almost any string is a valid ID。这只有在你包含jQuery(1.xx版本,而不是2.xx版本)时才会发生。
更多详情:
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" );