javascript - 更改图像原型
问题描述
一张图片如何增强setAttribute
?我确实尝试了几件事,但很快就遇到了问题。
var originalSetAttribute = Image.prototype.setAttribute;
Image.prototype.setAttribute = function (key, value) {
console.log('set attribute', key, ' -> ', value);
var val = (key === 'src') ? getCorrectSrc(value) : value;
// first attempt
originalSetAttribute(key, val);
// second attempt
Image.prototype.__proto__.setAttribute(key, val);
};
我得到Uncaught TypeError: Illegal invocation。
请不要发表“这是不好的做法”的评论,有时在生活中,您别无选择,只能在最糟糕的情况下破解自己的道路,因为您工作的特定 IT 领域一团糟并且充满了奇怪的标准.
另外,我会把这个逻辑放到 iframe 中,这样就不会弄乱顶部窗口的 Image。
目标:
第三方库使用以下 API 添加图像:
var img = new Image;
img.src = '..';
img.setAttribute('src', '..');
src
值被内联到他们的代码中,但我需要使用其他src
值。与解析他们的 JS 文件并进行昂贵而复杂的字符串搜索和替换相比,破解 Image 要容易得多。
如果您也可以帮助我使用图像src
设置器,则加分。谢谢!
解决方案
您需要使用您的修补程序调用.call
的原始setAttribute
函数:this
setAttribute
return originalSetAttribute.call(this, key, val);
要修补 setter(和 getter):
const { get, set } = Object.getOwnPropertyDescriptor(Image.prototype, 'src');
Object.defineProperty(Image.prototype, 'src', {
set(newVal) {
return set.call(this, getCorrectSrc(newVal));
},
get() {
return get.call(this);
}
});
推荐阅读
- php - 在 Laravel 5.8 中只显示最新的产品类别
- xml - XML 文件的结构阻止我用 python 读取它
- php - 在laravel中反向包含()?
- r - Nlmer 上升 is.numeric(nlpars <- start$nlpars) 不是 TRUE
- ruby-on-rails - ActiveStorage : 将照片的信用添加到附件
- sml - SML/NJ 中的过载冲突
- python - 遍历一个 url 列表
- c# - 尽管在当前线程中设置了正确的语言环境,但 C# DateTime.ToString() 在 Linux Ubuntu 18.04 上是错误的
- wordpress - WordPress 登录用户仅使用用户 ID - 登录不记得问题
- material-ui - 在 react-datepicker 中更改日历的背景颜色