(覆盖|| Extend)Javascript方法

时间:2009-12-17 07:23:09

标签: javascript dom mootools

我想更改方法DomElement.appendChild()在应用于我创建的Object时的工作方式不同:

// 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 个答案:

答案 0 :(得分:1)

我不了解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
    }

希望这有帮助

<强>更新    从你的进一步解释(处理任何DOM元素的appendChild),我明白没有通用的方法来定义本地hanlders来捕获事件。

但是有一个解决方法(我知道这非常难看)。意味着在使用appendChild之前必须为DOM元素定义LocalHandler。

在此之前     的document.getElementById( 'divTarget')。使用appendChild()

您必须将localhandler重新分配给您需要访问的元素

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

另一种选择: 如果你想保持简单,我建议这种替代方式。创建AppendChild本地方法,该方法接受对象,节点名称为param。

    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,"")
    
  4. 这是执行此操作的最佳方式。

答案 1 :(得分:0)

你应该在你的班级中使用 object.toElement()

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

然后只使用document.body.inject(instanceObject);

答案 2 :(得分:0)

var originAppend = Element.prototype.appendChild;
Element.prototype.appendChild = function(el){ 
    // do something to el
    originAppend.call(this, el);
}