我想更改方法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文件,我将被监禁谋杀。
请让我离开监狱!
答案 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);");
}
并且
如果您想将DOM元素附加到文档
AppendChild(DOMelement,"")
如果你想在其他内容中附加DOM元素 容器
AppendChild(DOMelement,"divTarget")
如果您想处理自定义对象
AppendChild(customObject,"")
这是执行此操作的最佳方式。
答案 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);
}