2010-02-27 15 views
13

El document.createElement() nativo es tonto-estúpido (solo requiere un nombre de etiqueta y ningún atributo). ¿Cómo es que no puedo anularlo? ¿Cómo es que esto no funciona?Anulando la función nativa?

var originalFunction = document.createElement; 

document.createElement = function(tag, attributes) { 
    var element = originalFunction(tag); 

    if (attributes) { 
     for (var attribute in attributes) { 
      element.setAttribute(attribute, attributes[attribute]); 
     } 
    } 

    return element; 
}; 

El problema es que los navegadores explotan cuando intentas reemplazar una función nativa. Como document no es una primitiva de JavaScript, tampoco puede crear un prototipo para ella. WTF.

+17

Creo 'document.createElement (..)' no piensa mucho de ustedes tampoco. –

+0

¿Por qué no solo crea y usa su propia función en lugar de anular las funciones nativas? –

+1

@KennethJ Porque algunas personas aún intentan crear una biblioteca de estandarización o intentan ejecutar el código de validación cuando se crea un elemento en el DOM, sin tener que crear espacios de nombres y otras cosas. – helly0d

Respuesta

1

Hasta donde yo sé, no puede anular los métodos nativos por razones de seguridad. Para los métodos no nativos no es un problema en absoluto.

+0

En algunos navegadores puede anular algunos métodos nativos. Todavía no he encontrado un método nativo que no pueda anularse. –

+0

@JimBlackler - La consola de FYI MSIE. no se puede anular, pero no por razones de seguridad, simplemente porque podrían hacerlo (ver, la consola no está cubierta por ES :) Microsoft en ello de nuevo, lol) – Christian

3

FWIW (informativo): puede anular los métodos "nativos", en algunos casos, y en algunos navegadores al menos. Firefox me permite hacer esto:

document.createElement = function(f) { alert(f); }; 

Que luego hace lo que esperas cuando se invoca. Pero todo tu bloque de código anterior arroja un error, al menos a través de Firebug.

Filosóficamente, debería ser capaz de hacer esto. Ciertamente, puede decir, redefinir métodos en el objeto Array, etc. Pero los métodos de ventana (DOM) no están cubiertos por ECMAScript, por lo que probablemente se les permita depender de la implementación. Y por supuesto, son así por razones de seguridad.

3

Por qué no sólo tiene que utilizar el método en su propia Función- escribir de la manera que desea, y nunca escribir de nuevo .... document.createElement

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

Por lo que yo puedo decir es que el problema una llamada a la función document.createElement() incluso cuando se hace referencia tiene que ser del documento. Así que modificar el código:

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

No hay manera de anular que, sin embargo se puede hacer un poco de truco por si no participaban de pase de parámetros no convencional (s) a una función nativa. Por lo tanto, la cuestión de crear elementos es que forme parte del XML DOM, por lo que puede crear el nombre de tag que desee. Y aquí está el truco, si pasa sus atributos como parte del primer parámetro (el nombre de etiqueta), separándolos con los delimitadores de su elección, y luego escuchando el evento onchange del DOM y si sus delimitadores se presentan en cualquier etiqueta, reemplácelos con el marcado adecuado, usando RegExp, por ejemplo.