Переопределение родной функции? - PullRequest
14 голосов
/ 27 февраля 2010

Нативный document.createElement() глупо (он принимает только имя тега и никаких атрибутов). Почему я не могу это переопределить? Почему это не работает?

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;
};

Проблема в том, что браузеры взрываются при попытке заменить встроенную функцию. Поскольку document не является примитивом JavaScript, вы также не можете создать прототип для него. WTF.

Ответы [ 6 ]

10 голосов
/ 23 июня 2011

Насколько я могу судить, проблема в том, что вызов функции document.createElement(), даже когда на него ссылаются, должен быть из документа. Поэтому измените свой код:

var element = originalFunction.call(document, tag);
3 голосов
/ 27 февраля 2010

Почему бы просто не использовать метод в своей собственной функции - написать его так, как вы хотите, и никогда больше не писать 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'});
3 голосов
/ 27 февраля 2010

FWIW (информационный): вы можете переопределить «родные» методы, в некоторых случаях и, по крайней мере, в некоторых браузерах. Firefox позволяет мне сделать это:

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

Что делает то, что вы ожидаете при вызове. Но весь ваш блок кода выше выдает ошибку, по крайней мере, через Firebug.

Философски, вы должны быть в состоянии сделать это. Вы, конечно, можете, скажем, переопределить методы объекта Array и т. Д. Но методы окна (DOM) не охватываются ECMAScript, и поэтому они, вероятно, могут зависеть от реализации. И, конечно, они таковы из соображений безопасности.

1 голос
/ 27 февраля 2010

Насколько я знаю, вы не можете переопределить нативные методы по соображениям безопасности. Для неродных методов это совсем не проблема.

0 голосов
/ 23 августа 2013

Шаблон прокси, упомянутый в JavaScript: переопределение alert () должно работать для этого.

Это упомянуто в jquery docs, но не похоже, что оно действительно зависит от jQuery.

Больше информации здесь: http://docs.jquery.com/Types#Proxy%5FPattern

0 голосов
/ 22 июня 2013

Невозможно переопределить это, однако вы можете совершить некоторую попытку, если не боитесь передачи нестандартных параметров в нативную функцию. Так что вещь о createElement заключается в том, что он является частью XML DOM, поэтому вы можете создать любой тэг, какой захотите. А вот и хитрость: если вы передаете свои атрибуты как часть первого параметра (тэга), разделяя их разделителями по вашему выбору, а затем прослушивая событие onchange DOM и если ваши разделители представлены в каком-либо замените их соответствующей разметкой, например, используя RegExp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...