2009-07-22 8 views
4

Ich versuche irgendwie den Konstruktor von HTMLElement (speziell HTMLDivElement) zu überschreiben, so dass, wann immer mit irgendwelchen Mitteln erstellt werden, ich einige benutzerdefinierte Logik ausführen kann.Eine Möglichkeit, den Konstruktor in HTMLElement zu überschreiben, damit ich benutzerdefinierten Code hinzufügen kann

Offensichtlich funktioniert das nicht:

 
HTMLDivElement.prototype.constructor = function() 
{ 
    alert('div created!'); 
} 

Gibt es eine Möglichkeit, dies zu ziehen aus? Selbst wenn es eine Möglichkeit gäbe, irgendeine Art von Ereignis auszulösen, wenn neue Elemente erstellt werden (die nicht Teil der HTML-Seite der Seite sind), wäre das hilfreich.

EDIT: Vielleicht gibt es etwas, was wir mit Mozillas Watch/Unwatch-Methoden machen könnten, um etwas Abwechslung zu sehen?

+2

Ich glaube nicht verwenden es möglich ist, aber ich würde gerne wissen, wie wenn es ist. – Quentin

+0

Machst du das für einen bestimmten Browser? Da das Konstruktorproblem ignoriert wird, sind diese DOM-Objekte beispielsweise im IE verfügbar. –

+0

Die Konstruktor-Sache muss in Firefox 3.0 und niedriger sowie IE8 funktionieren. Aber im Moment versuche ich nur, Firefox zum Laufen zu bringen und werde mich später mit IE8 beschäftigen. – Wolverine

Antwort

8

Ich bin dafür in die Hölle gehen:

document.createElement = (function (fn) 
{ 
    return function (tagName) 
    { 
     var elem = fn.call(document, tagName); 
     alert('just created a new ' + elem.tagName); 
     return elem; 
    }; 
})(document.createElement);   
+1

Nate ... komisch, du würdest das posten, es ist das, was ich mir nach dem Hacken ausgedacht habe ... obwohl ich zu schüchtern war, es zu posten :) – Wolverine

+2

+1 So kannst du mehr Spaß in der StackOverflow-Hölle haben. – Stellarator

+1

Natürlich funktioniert dies nicht für Elemente, die vom dom-Parser erstellt wurden (entweder beim Laden der Seite oder beim Festlegen von innerHTML). –

2

Wenn Sie jQuery verwenden möchten, gibt es ein Plugin namens Livequery, mit dem Sie Ereignisse auf noch nicht erstellten Elementen auslösen können. So Ihr Beispiel oben könnte wie folgt geschrieben werden:

$("div").livequery('load', function(event) { 
    alert('div created!'); 
}); 

Bitte beachte, dass ich mich nicht livequery versucht, aber ich bin zu raten, da es keine Antworten auf diese Frage.

Hoffe es hilft!

+2

Er bat um * pures JavaScript *! Bitte benutze jQuery erst, wenn er danach fragt. Ja, DOM ist manchmal hässlich, aber jQuery ist BÖSE. – m93a

+3

@ m93a: Ich weiß, dass es nicht das ist, wonach er ausdrücklich gefragt hat, also habe ich diesen Disclaimer am Anfang der Antwort hinzugefügt, um das zu verdeutlichen. Ich schlug auch vor, andere Antworten zu suchen. Außerdem: es ist von 2009, also glaube ich nicht, dass jQuery in dieser vor-mobilen Welt als so böse angesehen wurde. –

+2

Der Vanilla-Ansatz wäre [Mutations-Beobachter] (https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver) (das ist, was Live-Abfrage verwendet). –

0

ich bin nicht sicher, Sie können einen ‚Haken‘ machen bei jedem Aufruf eines jeden neuen Objekt in Javascript ... aber ich bin mir ziemlich sicher, dass Sie machen können Ihren eigenen Rahmen, in dem alles abfangbare sein .. ich empfehlen, sich bei: http://code.google.com/p/joose-js/

oder einfach durch Artikel gehen: http://www.sitepen.com/blog/2008/03/18/javascript-metaclass-programming/

python hat __new__ und __init__ als Schritte, um die Klassen zu konstruieren .. es wäre gut zu überprüfen, wie Javascript mit der Konstruktion neuer Objekte beschäftigt ist.

0

Steuern Sie nicht die Änderung/Erstellung dieser Elemente? Warum können Sie nicht manuell tun, was Sie wollen, nachdem jedes Element erstellt wurde?

+0

Ist das eine * Antwort *? – m93a

Verwandte Themen