3

setAttributePrototypeにコールバックを追加することは可能ですか?

alert("done !")この例では、いつsetAttribute()終了するかを示したいと思います。

img.setAttribute("src", "http://blabla.com/c.jpg");
4

2 に答える 2

2

根本的な解決策ではないかもしれませんが、

img.setAttribute("src", "http://blabla.com/c.jpg");
img.onload = imageCallback;

function imageCallback() { ... }

jQuery に興味がある場合は、waitforimagesというプラグインが役立つかもしれません。

于 2012-04-05T11:02:45.770 に答える
1

できますが、お勧めしません。

(function() {

    var elementSetAttribute = Element.prototype.setAttribute;

    Element.prototype.setAttribute = function() {
        whateverFunctionYouWant.call(this);

        return elementSetAttribute.apply(this, arguments);
    }

})();

jsFiddle .

などの操作を行うと呼び出さwhateverFunctionYouWant()れますdocument.links[0].setAttribute('href', '/')

src要素の属性を変更しimg、新しいリソースがロードされたときに、これがコールバックを呼び出すようにしたいようです...

(function() {

    var HTMLImageElementSetAttribute = HTMLImageElement.prototype.setAttribute;

    HTMLImageElement.prototype.setAttribute = function(attribute, value) {
        var image;

        if (attribute == 'src') {
            image = new Image;
            image.addEventListener('load', loaded, false);
            image.src = value;
        }

        return HTMLImageElementSetAttribute.apply(this, arguments);
    }

})();

jsFiddle .

setAttribute()ここで、コールバックとなる 3 番目のパラメーターを使用してオーバーロードできます。

私の意見と経験では、これを行う代わりに別の関数を作成します。プロトタイプを変更することは 1 つのことですが、ネイティブ DOM メソッドをオーバーロードして余分なことを行うことは、特にあなたが行ったことに慣れていない開発者がコードを見ると、トラブルを招くように思えます。

後者の例を IE9 より前で動作させたい場合は、attachEvent()フォールバックを使用してイベント リスナーを追加することは言うまでもありません。

于 2012-04-05T10:44:07.367 に答える