2009-08-20 2 views
2

Ich möchte eine Konstruktorfunktion erstellen, die ein DocumentElement-Objekt erstellt.JavaScript: Kann eine Konstruktorfunktion ein documentElement-Objekt erstellen?

Betrachten Sie als Beispiel den neuen Konstruktor von Audio() - er erstellt ein documentElement-Objekt, und wenn Sie ihm einige Variablen übergeben, füllt er das neue documentElement mit Attributen. Es fügt es nicht in das DOM ein, es erstellt einfach das Objekt.

Also ist die Frage - was unterscheidet ein documentElement von einem vanilla javascript-Objekt (der Art {property: value}), und können Sie Konstruktoren für sie wie für Objekte schreiben?

Edit:

Was ich liebäugelt mit ist das neue Audio() Konstruktor in Browser neu zu erstellen, die es nicht haben, einen Quicktime oder Flash-HTMLObjectElement anstelle des HTMLAudioElement verwenden.

Es ist in Ordnung für mich, dass audio.constructor auf HTMLObjectElement verweisen wird, da audio.constructor in HTMLAudioElement auf das neue Audio() in Browsern verweist, die es unterstützen.

Ich bin mir nicht sicher über den Audio.prototype. Wenn ich console.log (Audio.prototype) in Browsern mit Audio-Unterstützung abfrage, geben sie überhaupt nichts zurück - nicht einmal eine leere Zeile in der Datei console.log - das hat mich über den Haufen geworfen. Wenn ich richtig verstehe, beeinflusst das nicht, was ich vorhabe.

Ziel ist es, in der Lage zu sein, mit dem Audio-Konstruktor zu codieren, den Browser nativ behandeln zu lassen oder bei Bedarf eine Plugin-Instanz einzurichten.

+0

Ich habe gerade eine Notiz hier gesehen, die hilft: http://stackoverflow.com/questions/367768/javascript-detect-if-function-called-as-constructor Claudia sagt: Wenn eine Konstruktorfunktion Gibt ein Objekt zurück, das anstelle von verwendet wird. stephband

+0

Der 'Audio'-Konstruktor erstellt ein' documentElement'? Hast du Referenzen?Weil ich keinen 'Audio'-Konstruktor kenne. –

+0

Es ist neu. Es begleitet HTML5 und ermöglicht es Ihnen, Sounds von Javascript zu spielen. Sehen Sie sich die untere Hälfte des Blogposts an: http://html5doctor.com/native-audio-in-the-browser/ – stephband

Antwort

5

document Das Element ist nicht eine einfache JavaScript-Objekt ist ein Objekt DOM Element, welche die allgemeine DOM Kerndocument interface implementiert.

können Sie documentElements erstellen, indem document.implementation.createDocument (erhältlich von DOM Core Level 2) mit:

function createDocument() { 
var doc = document.implementation.createDocument('http://www.w3.org/1999/xhtml', 
                 'html', null), 
    body = document.createElementNS('http://www.w3.org/1999/xhtml', 'body'); 

    doc.documentElement.appendChild(body); 
    return doc; 
} 

Edit:

Sie so etwas wie dies bedeuten Sie?

function ElementCreator(tagName, attributes){ 
    this.element = document.createElement(tagName); 

    for (var i in attributes) { 
     this.element[i] = attributes[i]; 
    } 
    return this.element; 
} 

var anchor = new ElementCreator('a', { id: 'myLink', href:'http://google.com', 
             innerHTML:'Link text' }); 
document.body.appendChild(anchor); 
// <a id="myLink" href="http://google.com">Link text</a> 

Allerdings sehe ich nicht zu viel Vorteil der Verwendung einer Konstruktorfunktion dafür.

das Element aus der Konstruktionsfunktion zurückgeführt wird, wird das Objekt instance verloren, anchor.constructor in dem obigen Beispiel zu HTMLAnchorElement bezieht sich anstelle von ElementCreator, und dass der Zugang zum ElementCreator.prototype ebenfalls verloren.

Es wäre sinnvoller, wenn die Instanz des DOM-Elements in ein Member eingebettet wird oder einfach eine einfache Funktion implementiert.

+0

Tut mir leid, wenn ich nicht klar war. Du hast es falsch verstanden. Ich möchte eine Konstruktorfunktion (nicht nur eine Funktion) schreiben, die documentElements (nicht Dokumente) auf die Weise erzeugt, wie es document.createElement ('tag') tut. – stephband

+0

Danke für Ihre Bearbeitung. Das bringt mich auf den richtigen Weg. Ich habe auf Ihre Bedenken in einer Bearbeitung der Frage, über ... – stephband

+0

Ich denke, Ihre Terminologie ist ein bisschen verwirrt. Mit einem "documentElement" meinen Sie einfach einen DOM-Knoten? – bobince