我需要重写 document.createElement() 方法,我正在网上寻找 javascript 源代码以获得一些想法。我搜索了http://code.google.com/p/v8/source/browse但似乎搜索返回了来自所有 svn 源(甚至是不相关的库)的结果,这使得它变得混乱。我浏览了svn中的代码,当然有C++源代码,但显然没有javascript实现。
问问题
1431 次
1 回答
1
你不应该,通常也不能,重写原生 DOM 方法。诸如createElement
客户端 EMACscript 实现的“接近表面”的方法,具有受保护的范围,并且根本无法被“用户空间”脚本复制。
在 的情况下createElement
,您可能能够在某些浏览器中覆盖对象的createElement
功能document
(见下文),但您也会很快发现它在某些现有客户端/版本上崩溃和烧毁。此外,您无法更改的原型,document
因为它没有。
但是,您可以轻松无风险地创建一个小型包装函数:
var createElement = function (ele_type, attrs) {
var ele = document.createElement(ele_type);
if (!ele)
return false;
for (var idx in attrs) {
if ((idx == 'styles' || idx == 'style') && typeof attrs[idx] == 'object') {
for (var prop in attrs[idx]){ele.style[prop] = attrs[idx][prop]}
} else if (idx == 'html') {
ele.innerHTML = attrs[idx]
} else {
ele.setAttribute(idx, attrs[idx]);
}
}
// now fire any custom events or do whatever you needed to do
};
var myNewDiv = createElement ('div', {'id':'myNewDiv', 'styles':{'color':'red'}});
这使您有机会在创建新元素时实现自定义代码。无论实现差异如何,它都适用于所有浏览器,并且与您今天编写的任何其他代码一样面向未来。
上面提到的另一条路线,它不是跨浏览器或保证明天也能工作,是覆盖createElement
活动document
实例的功能。这种方法的问题在于文档对象不是由规范定义的——它是特定于实现的。今天,Firefox(例如)将允许您覆盖此功能,但这可能会更改,恕不另行通知。
document.createElement = function(originalDocumentCreate) {
return function() {
var ele = originalDocumentCreate.apply(this, arguments);
// now fire any custom events or do whatever you needed to do
return ele;
};
}(document.createElement);
另请参阅:https : //stackoverflow.com/a/11727842/610573(代码概念归功于 Esailija)
于 2013-02-20T20:23:03.233 回答