2013-04-22 44 views
11

我有一个有趣的问题,我想我已经找到了它的根源,但我想确定。我有一个链接调用一个名为remove()的函数。除Chrome之外的所有浏览器都不存在该功能的问题。但是,点击链接在Chrome中消失了,即使我在下面的示例中简化了该功能。我看过这个问题:Can't use "download" as a function name in javascript。然而,在链接中,我没有看到关于“删除”作为保留关键字的任何信息。我的问题是,我对这是一个关键字是正确的吗?如果是这样,有什么地方我可以找到一个谷歌关键字列表?我已经搜索,并没有发现这是其他地方的问题。是否在Google Chrome中“移除”保留的关键字?

<a href="javascript:void(0)" onclick="remove()">Remove</a> 

的Javascript:

function remove(){ 
alert("Hi"); 
} 
+0

我能够从控制台使用 – 2013-04-22 15:53:30

+1

是的,还的话就像'status' – 2013-04-22 15:54:34

+1

我认为你是对的 - 看看:https://productforums.google.com/forum/?fromgroups=#!topic/chrome/y9huP7JttMY – Adrift 2013-04-22 15:54:38

回答

8

Chrome中的元素有一个.remove()方法,该方法允许自行移除元素,而不必从父级移除元素。

麻烦的是,当使用属性处理程序时,您会得到一个不同的作用域链。该范围链包含元素本身以及document。这意味着元素的所有属性和document都显示为变量。

因为你命名你的函数remove(),因为它是一个全局函数/变量,它是由.remove财产(现在的变量)阴影元素本身。这可以通过警报来看到。如果你改变你的处理程序:

onclick="alert(remove)" 

...你会得到这样的:

function remove() { [native code] } 

因此,它不是,它的保留,而是它用作结束了阴影属性全球。


为了解决这个问题,要么使用全球直接:

onclick="window.remove()" 

或改变功能名称。

+0

很好的解释,谢谢。我将只更改函数名称。 – illinoistim 2013-04-22 16:38:22

+0

不客气。 – 2013-04-22 16:38:55

+0

只是想注意'.remove()'不仅仅是一个属性铬元素 - 它是新规范的一部分:) – 2013-11-04 22:38:37

1

我在铬没有问题,使用它,也不会以这种方式

<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); 
} 

你可以看看一个节点列表和循环在另一个answer here on SO了解更多有关事件绑定方法之间的差异,也做一点G搜索的主题会给你更多的信息。当然,你可以通过这种方式避免你遇到的问题。

+0

你能解释一下为什么使用addEventListener更好吗?如果有多个对remove函数的引用,我应该怎么做? – illinoistim 2013-04-22 16:36:42

+0

希望这是足够的信息来回答你的进一步问题,但我看到你已经选择了一个你满意的答案。 – Xotic750 2013-04-22 17:46:49

+0

我给你+1了。 – illinoistim 2013-04-25 16:51:04

1

我找不到它的任何文件,但在Chrome DOM元素有一个本地方法remove,显然删除它们。在onclick,this实际上是指元素本身,因此它最终调用this.remove()删除该元素。为了解决这个问题,你可以拨打window.remove()

http://jsfiddle.net/3YkZH/1/

这也将是最好使用标准的事件通过addEventListener结合不存在这个问题时简单地调用remove

http://jsfiddle.net/3YkZH/2/

+0

它是DOM规范的一部分:) http://dom.spec.whatwg.org /#dom-childnode-remove也相当新。 – 2013-11-04 22:40:41