Is id = "nodeName" зарезервировано в html5? - программирование
Подтвердить что ты не робот

Is id = "nodeName" зарезервировано в html5?

Я использую:

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

в моем html, а затем дайте jquery:

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

Затем консоль говорит, что:

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

После того, как я изменил идентификатор, все будет хорошо. Итак, есть ли зарезервированный идентификатор?

4b9b3361

Ответ 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" );

Я создал отчет об ошибке

Ответ 2

Нет, почти любая строка является допустимым ID. И это происходит только тогда, когда вы включаете jQuery (версия 1.xx, а не 2.xx).

Подробнее:

  • код работает, как в "он изменяет innerHTML"
  • как только вы включите jQuery, даже если вы его не используете, у вас есть ошибка в acceptData, когда dom готов, но после выполнения обратного вызова, который вы передали в $(document).ready.

Это ошибка jQuery. Почему это происходит, по-видимому, связано с тем, что window.nodeName определяется этим элементом (который не имеет метода toLowerCase как его элемент) тем, что существует элемент с этим идентификатором. Кажется, что в jQuery 2.02 все нормально.