Является ли "удалить" зарезервированное ключевое слово в Google Chrome?
У меня есть интересная проблема, и я думаю, что дошел до ее корня, но я хотел быть уверен. У меня есть ссылка, которая вызывает функцию с именем remove(). Все браузеры, кроме Chrome, не имели проблем с этой функцией. Однако ссылка, по которой щелкнули, исчезла в Chrome, даже когда я упростил функцию, как в примере ниже. Я видел этот вопрос: не могу использовать "скачать" в качестве имени функции в JavaScript. В ссылках, однако, я не увидел ничего о "удалить" как зарезервированное ключевое слово. Мой вопрос заключается в следующем: я правильно сказал, что это ключевое слово? Если да, могу ли я найти список ключевых слов Google? Я искал и не нашел, что это проблема где-либо еще.
<a href="javascript:void(0)" onclick="remove()">Remove</a>
Javascript:
function remove(){
alert("Hi");
}
3 ответа
Элементы в Chrome имеют .remove()
метод, который позволяет самостоятельно удалять элемент вместо того, чтобы делать это от родителя.
Проблема в том, что при использовании обработчиков атрибутов вы получаете другую цепочку областей видимости. Эта цепочка включает в себя сам элемент, а также document
, Это означает, что все свойства элемента и document
показать как переменные.
Потому что вы назвали свою функцию remove()
и поскольку это глобальная функция / переменная, она скрывается .remove
свойство (теперь переменное) для самого элемента. Это можно увидеть с предупреждением. Если вы измените ваш обработчик на:
onclick="alert(remove)"
... вы получите что-то вроде:
function remove() { [native code] }
Таким образом, дело не в том, что оно зарезервировано, а в том, что оно используется как свойство, которое в итоге скрывает глобальное.
Чтобы это исправить, либо используйте глобальный напрямую:
onclick="window.remove()"
Или измените имя функции.
У меня не было проблем с использованием хрома, ну не так
<a href="#" id="remove">Remove</a>
function remove() {
alert("Hi");
}
document.getElementById("remove").addEventListener("click", remove, false);
на jsfiddle
Встроенный JavaScript считается плохой практикой.
Если у вас есть больше элементов, использующих одну и ту же функцию, просто добавьте больше строк, как это
document.getElementById("remove1").addEventListener("click", remove, false);
document.getElementById("remove2").addEventListener("click", remove, false);
document.getElementById("remove3").addEventListener("click", remove, false);
document.getElementById("remove4").addEventListener("click", remove, false);
или вы могли бы получить список узлов и пройти через это
var nodelist = document.querySelectorAll("[id^=remove]");
Array.prototype.forEach.call(nodelist, function (element) {
element.addEventListener("click", remove, false);
}
Вы можете взглянуть на другой ответ здесь на SO, чтобы узнать больше о различиях между методами привязки событий, а также выполнить небольшой поиск G по этой теме, чтобы получить дополнительную информацию. И, конечно, вы бы избежали проблемы, с которой столкнулись, если бы делали это таким образом.
Я не могу найти какую-либо документацию по нему, но элементы DOM в Chrome имеют собственный метод remove
это, очевидно, удаляет их. В onclick
, this
на самом деле относится к самому элементу, так что в конечном итоге вызывает this.remove()
который удаляет элемент. Чтобы обойти это, вы можете просто позвонить window.remove()
вместо.
Также было бы лучше использовать стандартную привязку событий через addEventListener
который не имеет этой проблемы при простом вызове remove
: