我需要重写document.createElement()方法,我正在网上寻找一个javascript源代码来获得一些想法。我搜索了http://code.google.com/p/v8/source/browse,但似乎搜索返回了所有svn源(甚至是非相关库)的结果,这使得它变得混乱。我浏览了svn中的代码,当然有C ++源代码,但显然没有javascript实现。
答案 0 :(得分:1)
您不应该(通常也不能)重写本机DOM方法。诸如createElement
之类的方法是接近表面的方式"客户端的EMACscript实现,具有受保护的范围,并且根本无法被" userland"脚本。
如果是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的代码概念)