覆盖 HTML img src 分配

Overriding HTML img src assignments

我试图通过重新定义 Image/HTMLImage 对象的 属性 来动态覆盖所有 IMG url 分配。它正确地拦截了分配,但新的 URL 不起作用,而且它似乎完全破坏了 img 正常工作的能力。

这是否可能与定义属性的其他东西(例如变异观察者)有关?

(p.p.s。对于我的特定用例,分配 this.srcset=e; 效果很好但很丑)

<html>
<body>
<script>
if(!window.once) {
window.once = 1;

Object.defineProperty( 
    Image.prototype,'src',{configurable: true
    , get: function() { 
      console.log(this.__src);
    return this.__src; }

    , set: function(e) {
        if(e.includes('replacemask')) {
         e='rep.jpg';
    }
    this.__src=e; console.info('aaa:', e) } });

}       

var x = new Image;
x.src="-.jpg";

document.body.append(x);

</script>
</body>
</html>     

您需要先提取“原始”setter 和 getter,然后自己调用它们:

// get the original descriptor
const desc = Object.getOwnPropertyDescriptor(HTMLImageElement.prototype, "src");
Object.defineProperty(
  HTMLImageElement.prototype, "src", {
    ...desc,
    get: function() {
      console.log(this.__src);
      // call the original getter
      return desc.get.call(this);
    },
    set: function(e) {
      if (e.includes('replacemask')) {
        e = e.replace('replacemask', 'demonstration_1.png');
      }
      // get the original setter
      desc.set.call(this, e);
      console.info('aaa:', e)
    }
  });

var x = new Image;
x.src = "https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_replacemask";
document.body.append(x);

但是请注意,这不是更新 HTMLImageElement 的当前源的唯一方法。您有明显的 setAttribute,但也有不太明显的 srcset<picture><source> 情况。