2013-04-22 66 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