2016-12-04 184 views
0

我試圖攔截HTMLImageElement的圖像()構造函數:攔截的Javascript HTMLImageElement構造

https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/Image

var origImgConstr = HTMLImageElement.prototype.constructor;             
Image = function(width, height) {                    
    console.log('image constructor!');                   
    return new origImgConstr(arguments);                   
}; 

,但我得到

Uncaught TypeError: Illegal constructor(…) 

同樣的結果,如果我有HTMLImageElement取代Image

我錯過了什麼?

+0

這是專門'Image'要截距? –

+0

是的。它是否特別? – rlib

+1

'HTMLImageElement'是一個接口,而不是一個類。 –

回答

3

ImageHTMLImageElement的構造函數功能不一樣。您無法跨越可靠的跨瀏覽器的後者。

前言:重寫Image不會攔截由HTML解析器img元素或document.createElement調用的創建。據我所知,這是不可能的跨瀏覽器。你可以做的是捕獲所有圖像,因爲它們通過mutation observer添加到文檔中。但是這只是在被添加而不是創建的時候捕捉到它們。

但是:你說這是Image,具體而言,要覆蓋,因此替換它之前採取的Image原始值,並使用它。

例子:

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);

在ES2015,如果這是一個選擇:

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'是一個非數字。 – 2016-12-04 19:03:19

+1

@squint:這就是我的防守。 :-)我不知道*實現不會看到實際收到的參數的數量,所以......(並且感謝天堂ES2015的傳播符號,在ES2015中這將是一個很好的清晰的圖像= ...(function)(... args){console.log(「Intercepted」); return new originalImage(... args);};') –

+0

*「...感謝ES2015傳播符號的天堂......」以及許多其他增加的內容開始使本機語法實際上令人愉快地使用。 – 2016-12-04 19:06:53