2010-11-18 31 views
5

我有一些JavaScript代碼定義了一個函數getElementsByAttribute如下:Object.prototype中在JavaScript

Object.prototype.getElementsByAttribute = function(attr) { 
    var children = this.all || this.getElementsByTagName('*'), 
     ret = [], i, c; 
     for(i=0; i<children.length; i++) { 
      c = children[i].getAttribute(attr); 
      if(typeof c == "string" && c != "") 
       ret.push(children[i]); 
     } 
    return ret; 
} 

這個工作在我測試的所有瀏覽器,除了IE 7(大概低) - 這些的browers拋出「對象不支持這個屬性或方法。」
我可以想到的唯一不同的是,當我定義了原型函數時,對象已經創建...
將函數定義爲...的好辦法,「正常」函數並將元素作爲參數傳遞,是否有任何方法可以在IE7及以下版本中實現這一功能?

回答

6

IE DOM元素不是正常的Javascript對象,並且不像您期望的那樣繼承原型。

http://perfectionkills.com/whats-wrong-with-extending-the-dom/

+0

謝謝 - 好東西我不經常使用這些東西,並且已經有了後備! – 2010-11-18 02:01:34

+0

但他並沒有試圖添加DOM元素的原型,而是添加了Object的原型,完全不同。 – 2012-12-18 10:02:38

+0

@torazaburo:是的,但他期望DOM元素繼承Object.prototype。他們不。 – SLaks 2012-12-18 14:09:42

1

添加的東西Object.prototype真的壞主意。它將被添加到每對象,這將導致意外行爲,我保證它。

只需定義您的函數並將其裝飾到您需要的任何動態對象上即可。

+0

好的,將其重新定義爲正常功能。謝謝:) – 2010-11-18 02:51:58

+0

@Kolink,建議*不*重新定義它作爲一個正常的函數,雖然這是一個合理的事情要做,而是明確地將它添加到你將要調用它的對象。 – 2012-12-18 10:03:49

相關問題