2010-11-18 6 views
5

ho qualche codice JavaScript che definisce una funzione getElementsByAttribute come segue:Object.prototype in 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; 
} 

Questo funziona in tutti i browser che ho testato in, ad eccezione di Internet Explorer 7 (e presumibilmente inferiore) - queste browers throw "Object non supporta questa proprietà o metodo."
L'unica cosa che posso pensare che non mi piace è che gli Oggetti sono già stati creati quando ho definito la funzione prototipo ...
Shrot di definire la funzione come ... beh, un "normale" funzione e passando l'elemento come argomento, c'è un modo per farlo funzionare in IE7 e sotto?

risposta

6

IE Elementi DOM non sono oggetti JavaScript normali e non ereditano prototipi come ci si aspetterebbe.

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

+0

Grazie - buona cosa non uso spesso questa roba e ci sono già fallimenti! –

+0

Ma non sta cercando di aggiungere al prototipo di elementi DOM, sta aggiungendo al prototipo di Object, completamente diverso. –

+0

@torazaburo: Sì, ma si aspetta che gli elementi DOM ereditino 'Object.prototype'. Non lo fanno. – SLaks

1

Aggiunta di cose da Object.prototype è un davvero cattiva idea. Verrà aggiunto a ogni oggetto e ciò causerà un comportamento indesiderato, lo garantisco.

Basta definire la funzione e decorarla su qualsiasi oggetto necessario dinamicamente.

+0

Ok, lo ha ridefinito come una funzione normale. Grazie :) –

+0

@Kolink, il suggerimento era * non * di ridefinirlo come una funzione normale, anche se questa è una cosa ragionevole da fare, ma piuttosto di aggiungerla esplicitamente agli oggetti su cui la chiamerai. –