gpt4 book ai didi

javascript - 拦截 Javascript HTMLImageElement 构造函数

转载 作者:行者123 更新时间:2023-11-28 18:14:38 25 4
gpt4 key购买 nike

我尝试拦截 HTMLImageElement 的 Image() 构造函数:

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(…)

如果将 Image 替换为 HTMLImageElement,结果相同。

我错过了什么?

最佳答案

ImageHTMLImageElement 的构造函数不是同一个函数。您无法可靠地跨浏览器覆盖后者。

前言:覆盖 Image 不会拦截 HTML 解析器或 document.createElement 创建 img 元素来电。据我所知,这是不可能的跨浏览器。您可以做的是捕获通过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 = "/image/rQIK0.jpg?s=64&g=1";
document.body.appendChild(img);
img = new Image(32, 20);
img.src = "/image/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 = "/image/rQIK0.jpg?s=64&g=1";
document.body.appendChild(img);
img = new Image(32, 20);
img.src = "/image/rQIK0.jpg?s=64&g=1";
document.body.appendChild(img);

关于javascript - 拦截 Javascript HTMLImageElement 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40962263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com