1

我需要重写 document.createElement() 方法,我正在网上寻找 javascript 源代码以获得一些想法。我搜索了http://code.google.com/p/v8/source/browse但似乎搜索返回了来自所有 svn 源(甚至是不相关的库)的结果,这使得它变得混乱。我浏览了svn中的代码,当然有C++源代码,但显然没有javascript实现。

4

1 回答 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 回答