2010-02-27 2 views
13

Die native document.createElement() ist dumm-dumm (es dauert nur ein Tag-Name und keine Attribute). Wie kann ich es nicht überschreiben? Warum funktioniert das nicht?Überschreiben der nativen Funktion?

Das Problem ist, dass Browser explodieren, wenn Sie versuchen, eine native Funktion zu ersetzen. Da document kein JavaScript-Primitiv ist, können Sie auch keinen Prototyp dafür erstellen. WTF.

+17

Ich denke 'document.createElement (..)' hält nicht viel von Ihnen auch nicht. –

+0

Warum nicht einfach eine eigene Funktion erstellen und verwenden, statt native Funktionen zu überschreiben? –

+1

@KennethJ Da einige Leute immer noch versuchen, eine Standardisierungsbibliothek zu erstellen oder zu versuchen, einen Validierungscode auszuführen, wenn ein Element im DOM erstellt wird, ohne Namespaces und anderes Zeug erstellen zu müssen. – helly0d

Antwort

1

Soweit ich weiß, können Sie native Methoden aus Sicherheitsgründen nicht überschreiben. Für nicht-native Methoden ist das überhaupt kein Problem.

+0

In einigen Browsern können Sie einige native Methoden überschreiben. Ich habe noch keine native Methode gefunden, die nicht überschrieben werden kann. –

+0

@ JimBlackler - FYI MSIE Konsole. kann nicht überschrieben werden, aber nicht aus Sicherheitsgründen, nur weil sie es tun könnten (siehe, Konsole wird nicht von ES abgedeckt :) Microsoft wieder, lol) – Christian

3

FWIW (informativ): Sie können "native" Methoden in einigen Fällen und zumindest in einigen Browsern überschreiben. Firefox lässt mich das tun:

Welche dann wie erwartet, wenn aufgerufen wird. Aber dein ganzer Codeblock wirft einen Fehler, zumindest über Firebug.

Philosophisch sollten Sie in der Lage sein, dies zu tun. Sie können, sagen wir, Methoden auf dem Array-Objekt usw. neu definieren. Die Fenster (DOM) -Methoden werden jedoch nicht von ECMAScript abgedeckt, und daher sind sie wahrscheinlich implementierungsabhängig. Und natürlich sind sie aus Sicherheitsgründen so.

3

Warum nicht einfach die Methode in Ihrem eigenen verwenden funktions- es die Art und Weise schreiben Sie wollen, und nie wieder document.createElement schreiben ....

document.create= function(tag, parent, attributes){ 
    tag= document.createElement(tag); 
    for(var p in attributes){ 
     if(p== 'css') tag.style.cssText= attributes.css; 
     else if(p== 'text') tag.appendChild(document.createTextNode(attributes.text)); 
     else tag[p]= attributes[p]; 

    } 
    if(parent) parent.appendChild(tag); 
    return tag; 
    } 

document.create('p',document.body,{css:'font-style:italic',className:'important',title:'title', 
text:'whatever text you like'}); 
10

Soweit ich das Problem ist, sagen kann, dass ein Aufruf an die document.createElement() Funktion, auch wenn referenziert aus dem Dokument sein muss. So ändern Sie den Code:

var element = originalFunction.call(document, tag); 
0

Es gibt keine Möglichkeit, dass außer Kraft zu setzen, jedoch können Sie einige Hack tun um, wenn Sie nicht affraid unkonventionelle Parameter übergeben (s) zu einer nativen Funktion. Also die Sache mit createElement, dass es der Teil des XML-DOM sein soll, also können Sie den gewünschten Tagnamen erstellen. Und hier ist der Trick, wenn Sie Ihre Attribute als Teil des ersten Parameters (der Tagname) übergeben, sie mit den Trennzeichen Ihrer Wahl trennen und dann das onchange-Ereignis des DOM abhören und ob Ihre Trennzeichen in einem beliebigen dargestellt werden Tag, ersetzen Sie sie mit dem richtigen Markup, zum Beispiel mit RegExp.

Verwandte Themen