Ответ 1
Он не работает в следующей функции:
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 выполняет проверку, чтобы увидеть, какие элементы могут обрабатывать data-attributes
, когда jQuery готов. Во время этой проверки он вызывает функцию acceptData в элементе window
.
Это в самых последних версиях jQuery 1, начиная с версии 1.8.0 и вплоть до последней версии 1.10.1. Кажется, что ошибка появилась в результате изменения jQuery 1.8:
$(element).data( "events" ): В версии 1.6 jQuery отделил свои внутренние данные от данных пользователей, чтобы предотвратить коллизии имен. Тем не менее, некоторые люди использовали внутреннюю недокументированную структуру данных "событий", поэтому мы позволили по-прежнему извлекать это через .data(). Это теперь удалено в 1.8, но вы можете получить данные событий для целей отладки с помощью $._ data (element, "events" ). Обратите внимание, что это не поддерживаемый публичный интерфейс; фактические структуры данных могут изменяться несовместимо с версией на версию.
Окно передается в jQuery._data
как cur
в строке 2939 в версия 1.8.0, чтобы проверить внутренний "События" на объекте окна. Это происходит, когда jQuery запускает события $(document).ready
$(window).ready
. Поскольку окно не является DOM node acceptData не следует вызывать в окне вообще.
handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );