1

document.createElement() メソッドを書き直す必要があり、アイデアを得るためにオンラインで javascript ソース コードを探しています。http://code.google.com/p/v8/source/browseを検索しましたが、検索するとすべての svn ソース (関連のないライブラリも含む) から結果が返されるようで、面倒です。svn のコードを参照しました。もちろん、C++ ソース コードはありますが、明らかに JavaScript の実装はありません。

4

1 に答える 1

1

ネイティブ DOM メソッドを書き換えるべきではなく、通常は書き換えることもできません。などのメソッドcreateElementは、クライアントの EMACscript 実装の「表面に近い」ものであり、スコープが保護されており、「ユーザーランド」スクリプトで再現することはできません。

の場合、特定のブラウザでオブジェクトの機能createElementを上書きできる場合がありますが(以下を参照)、特定の既存のクライアント/バージョンでオブジェクトがクラッシュして焼き付くこともすぐにわかります。さらに、プロトタイプがないため、プロトタイプを変更することはできません。createElementdocumentdocument

ただし、簡単にリスクなしで小さなラッパー関数を作成できます。

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 (Esailja のコード コンセプト クレジット)

于 2013-02-20T20:23:03.233 に答える