截取Javascript HTMLImageElement构造函数
我尝试截取HTMLImageElement的Image()构造函数: 但我明白了截取Javascript HTMLImageElement构造函数,javascript,html,image,dom,intercept,Javascript,Html,Image,Dom,Intercept,我尝试截取HTMLImageElement的Image()构造函数: 但我明白了 Uncaught TypeError: Illegal constructor(…) 如果我用HTMLImageElement替换Image,结果相同 我错过了什么?Image和HTMLImageElement的构造函数不是同一个函数。您不能跨浏览器覆盖后者 前言:重写图像将不会拦截HTML解析器或document.createElement调用创建img元素。据我所知,这是不可能跨浏览器的。您所能做的就是通过
Uncaught TypeError: Illegal constructor(…)
如果我用HTMLImageElement
替换Image
,结果相同
我错过了什么?
Image
和HTMLImageElement
的构造函数不是同一个函数。您不能跨浏览器覆盖后者
前言:重写图像
将不会拦截HTML解析器或document.createElement
调用创建img
元素。据我所知,这是不可能跨浏览器的。您所能做的就是通过一个链接捕获所有添加到文档中的图像。但这只是在添加时捕捉它们,而不是在创建时捕捉它们
但是:您已经说过它是图像
,具体来说,您想覆盖它,所以在替换它之前取图像
的原始值,并使用它
例如:
var originalImage=Image;
图像=功能(宽度、高度){
var结果;
控制台日志(“截获”);
开关(arguments.length){
案例0:
结果=新的原始图像();
打破
案例1:
结果=新的原始图像(宽度);
打破
违约:
结果=新的原始图像(宽度、高度);
打破
}
返回结果;
};
var img=新图像();
img.src=”https://i.stack.imgur.com/rQIK0.jpg?s=64&g=1";
文件.正文.附件(img);
img=新图像(32,20);
img.src=”https://i.stack.imgur.com/rQIK0.jpg?s=64&g=1";
文件.正文.附件(img)
Image
和HTMLImageElement
的构造函数不是同一个函数。您不能跨浏览器覆盖后者
前言:重写图像
将不会拦截HTML解析器或document.createElement
调用创建img
元素。据我所知,这是不可能跨浏览器的。您所能做的就是通过一个链接捕获所有添加到文档中的图像。但这只是在添加时捕捉它们,而不是在创建时捕捉它们
但是:您已经说过它是图像
,具体来说,您想覆盖它,所以在替换它之前取图像
的原始值,并使用它
例如:
var originalImage=Image;
图像=功能(宽度、高度){
var结果;
控制台日志(“截获”);
开关(arguments.length){
案例0:
结果=新的原始图像();
打破
案例1:
结果=新的原始图像(宽度);
打破
违约:
结果=新的原始图像(宽度、高度);
打破
}
返回结果;
};
var img=新图像();
img.src=”https://i.stack.imgur.com/rQIK0.jpg?s=64&g=1";
文件.正文.附件(img);
img=新图像(32,20);
img.src=”https://i.stack.imgur.com/rQIK0.jpg?s=64&g=1";
文件.正文.附件(img)代码>你想截取的是图像
?是的。它有什么特别的吗?HTMLImageElement
是一个接口,而不是一个类……无论如何,如果您需要捕获所有正在创建的图像,这是不行的。如果您只需要调用所做的Image
,我就不必麻烦修改原始构造函数,只需创建一个调用新图像的不同函数@rlib:您需要重写.outerHTML
,.innerHTML
,.insertAdjacentHTML()
,.cloneNode()
,.createElement()
和Image()
作为初学者。这仍然无法处理页面加载时创建的元素,因此您需要提前进行DOM选择才能获得这些元素。您要截取的是Image
?是的。它有什么特别的吗?HTMLImageElement
是一个接口,而不是一个类……无论如何,如果您需要捕获所有正在创建的图像,这是不行的。如果您只需要调用所做的Image
,我就不必麻烦修改原始构造函数,只需创建一个调用新图像的不同函数@rlib:您需要重写.outerHTML
,.innerHTML
,.insertAdjacentHTML()
,.cloneNode()
,.createElement()
和Image()
作为初学者。这仍然无法处理页面加载时创建的元素,因此您需要提前进行DOM选择才能获得这些元素。neworiginalimage(width,height)
是否工作不可靠?我想他们会认为<代码>未定义< /代码>是非数字。@斜视:这就是我的防御。我不知道实现不会查看实际收到的参数数量,所以。。。(谢天谢地,在ES2015中,它将是一个非常清晰的Image=function(…args){console.log(“Intercepted”);return new originalImage(…args);};
)“…谢天谢地,ES2015的扩展符号…”对于这一点,以及其他许多开始使本机语法真正易于使用的补充。@T.J.Crowder:“重写图像不会被HTML解析器截获创建元素……据我所知,这是不可能跨浏览器的。”如果您还记得如何以某种特定/不可靠的方式执行此操作,请更新您的答案!新的原始图像(宽度、高度)
是否工作不可靠?我想他们会认为<代码>未定义< /代码>是非数字。@斜视:这就是我的防御。我不知道实现不会查看实际收到的参数数量,所以。。。(谢天谢地ES2015的扩展符号,在ES2015中,它将是一个非常清晰的Image=function(…args){console.log(“Intercepted”);返回新的原始图像(…args);};
)“…谢天谢地ES2015的扩展符号…”以及其他许多开始让本机语法变得令人愉快的补充
Uncaught TypeError: Illegal constructor(…)