2015-04-21 58 views
2

我使用此解決方案:(來源:Remove element by idElement.prototype.remove - 關閉編譯器警告

Element.prototype.remove = function() { 
    this.parentElement.removeChild(this); 
} 
NodeList.prototype.remove = HTMLCollection.prototype.remove = function() { 
    for(var i = 0, len = this.length; i < len; i++) { 
     if(this[i] && this[i].parentElement) { 
      this[i].parentElement.removeChild(this[i]); 
     } 
    } 
} 

我得到在關閉編譯如下警告:

externs.zip//w3c_dom2.js:793: WARNING - mismatch of the remove property type and the type of the property it overrides from superclass Element original: function (this:Element): undefined override: function (this:HTMLSelectElement, number): undefined HTMLSelectElement.prototype.remove = function(index) {};

如何我可以清除此警告嗎?或者我應該使用另一種方法來處理element.remove?

+1

最簡單的解決方案 - 只需選擇不同的功能名稱。 –

回答

3

編譯器警告你,從Element繼承的類已經有一個名爲remove的方法,它的簽名與你的不匹配。在這種情況下,HTMLSelectElement

如果您忽略該警告,那麼您的移除方法將無法正確運行HTMLSelectElement元素 - 因爲該函數執行的操作與您定義的行爲非常不同。

@php_nub_qq的評論是正確的。選擇一個與繼承鏈中現有對象不衝突的方法名稱。

+1

請注意,'HTMLSelectElement :: remove'被重載 - 如果沒有索引調用,它確實等價於['Node :: remove'](https://developer.mozilla.org/en-US/docs/Web/ API/ChildNode /刪除)。 Polyfillying當然應該尊重這一點,但使用不同的方法名稱並不是真正的選擇。我想知道GCC如何處理重載的方法。 – Bergi

+2

我錯過了新的'ChildNode'界面。 Closure編譯器目前不識別/實現該接口。我會看到讓這工作。這將解決問題。 –