(Переопределить || Расширить) Метод Javascript - PullRequest
2 голосов
/ 17 декабря 2009

Я хочу изменить метод DomElement.appendChild (), чтобы он работал по-разному при применении к объекту, который я создал:

// using MooTools;
var domElement = new Class({...});

var MyObject = new domElement(...);

$(document).appendChild(MyObject); // Error

// I want to add to (extend) appendChild, to do something specific, when:
alert(MyObject instanceof domElement); // true

Я мог бы сделать это, изменив mootools.js, но я хочу избежать этого любой ценой, потому что я уверен, что однажды другой разработчик перезапишет файл js обновленной версией, и я буду заключен в тюрьму за убийство.

Пожалуйста, держите меня в тюрьме!

Ответы [ 3 ]

1 голос
/ 17 декабря 2009

Я не знаю о MooTools, но в нативном JS есть простой способ сделать это ..

    var orgAppendChild = document.appendChild;  
    document.appendChild = localAppendHandler;


    var domElement = new Class({...});
    var MyObject = new domElement(...);
    // document.appendChild(MyObject);

     var ss = document.createElement('tr'); 
document.appendChild (ss);


    function localAppendHandler(MyObject)
    {
     if (MyObject instanceof domElement)
        UrCustomRoutine(MyObject )
        else
            orgAppendChild(MyObject);


    }

    function UrCustomRoutine(MyObject ){
    //your custom routine
    }

Надеюсь, это поможет

Обновление: Из вашего дальнейшего объяснения (обработки appendChild любого элемента DOM) я понимаю, что не существует общего способа определения локальных обработчиков для захвата события.

Но есть обходной путь (это очень уродливо, я знаю). Означает, что вам нужно определить LocalHandler для элемента DOM, прежде чем вы собираетесь использовать appendChild.

Перед этим document.getElementById ( 'divTarget'). AppendChild ()

вам нужно переназначить локальный обработчик на элемент, к которому вам нужен доступ

    orgAppendChild = document.getElementById('divTarget').appendChild;  
    document.getElementById('divTarget').appendChild = localAppendHandler;
    var sss = document.createElement('table'); 
    document.getElementById('divTarget').appendChild(sss);

Другая альтернатива: Если вы хотите сохранить простоту, я предлагаю этот альтернативный способ. Создайте локальный метод AppendChild, который принимает объект и имя узла в качестве параметра.

    function AppendChild(MyObject ,Node)
    {
           if (MyObject instanceof domElement)
               //your custom routine
           else if (Node=="" && (MyObject instanceof domElement==false))
               document.appendChild(MyObject);
           else if (Node!="" && (MyObject instanceof domElement==false))
               eval( "document.getElementById('" + Node + "').appendChild(MyObject);");


    }

И

  1. Если вы хотите добавить элемент DOM к документу

     AppendChild(DOMelement,"")
    
  2. Если вы хотите добавить элемент DOM в другой контейнер

     AppendChild(DOMelement,"divTarget")
    
  3. Если вы хотите обработать ваш пользовательский объект

     AppendChild(customObject,"")
    

это лучший способ сделать это.

0 голосов
/ 27 сентября 2016
var originAppend = Element.prototype.appendChild;
Element.prototype.appendChild = function(el){ 
    // do something to el
    originAppend.call(this, el);
}
0 голосов
/ 17 декабря 2009

вы должны посмотреть, используя object.toElement () в вашем классе

http://blog.kassens.net/toelement-method

, затем просто используйте document.body.inject (instanceObject);

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