2016-12-04 9 views
0

私はHTMLImageElementの画像()コンストラクタを傍受してみてください。インターセプトJavascriptをHTMLImageElementは、コンストラクタ

私は何が間違っていますか?

+0

それは特に 'Image'は、あなたがしたいですインターセプト? –

+0

はい。それはとにかく特別ですか? – rlib

+1

'HTMLImageElement'はインタフェースであり、クラスではありません。 –

答えて

3

ImageHTMLImageElementのコンストラクタは同じ関数ではありません。後者のブラウザ間を確実にオーバーライドすることはできません。

序文:Imageのオーバーライドは、HTMLパーサまたはdocument.createElement呼び出しによってimg要素の作成をインターセプトしません。私が知っている限り、それは不可能なクロスブラウザです。あなたはになります doは、ドキュメントにmutation observerで追加されたすべての画像をキャッチします。しかし、それは追加された時点で捕捉され、作成されたものではありません。

しかし:あなたは具体的には、あなたがオーバーライドするので、それを交換する前にImageの元の値を取り、それを使用したい、それはImageだと述べました。

例:ES2015では

var originalImage = Image; 
 
Image = function(width, height) { 
 
    var result; 
 
    console.log("Intercepted"); 
 
    switch (arguments.length) { 
 
     case 0: 
 
     result = new originalImage(); 
 
     break; 
 
     case 1: 
 
     result = new originalImage(width); 
 
     break; 
 
     default: 
 
     result = new originalImage(width, height); 
 
     break; 
 
    } 
 
    return result; 
 
}; 
 

 
var img = new Image(); 
 
img.src = "https://i.stack.imgur.com/rQIK0.jpg?s=64&g=1"; 
 
document.body.appendChild(img); 
 
img = new Image(32, 20); 
 
img.src = "https://i.stack.imgur.com/rQIK0.jpg?s=64&g=1"; 
 
document.body.appendChild(img);

、あなたのためのオプションだ場合:

const originalImage = Image; 
 
Image = function(...args) { 
 
    console.log("Intercepted"); 
 
    return new originalImage(...args); 
 
}; 
 

 
let img = new Image(); 
 
img.src = "https://i.stack.imgur.com/rQIK0.jpg?s=64&g=1"; 
 
document.body.appendChild(img); 
 
img = new Image(32, 20); 
 
img.src = "https://i.stack.imgur.com/rQIK0.jpg?s=64&g=1"; 
 
document.body.appendChild(img);

+0

'new originalImage(width、height)'は確実に動作しませんか?私は彼らが 'undefined 'を非数字とみなすだろうと思っています。 –

+1

@squint:それは私が守備的なことです。 :-)私は、実装が実際に受け取った議論の数を調べるつもりはないことを知っているわけではありません。(ES2015の普及表記の天国に感謝します.ES2015では素晴らしいImage –

+0

* "ES2015のスプレッド表記のために天に感謝してください..." * For(... args){console.log( "Intercepted");新しいoriginalImage(... args);}; '他にも多くの追加機能があり、ネイティブ構文を実際に使いやすくすることができます。 –

関連する問題