改变图像标签的原型?

asu*_*and 7 javascript dom

我正在尝试编写一个可以执行以下操作的库.

当库包含在头部时,它会改变HTMLImageElement原型,以便用户碰巧在HTML中使用的任何图像标记或者他们在javascript中动态创建的图像标记将具有由我的库定义的默认的onerror函数.

这样做的结果是,如果任何用户图像无法加载,因为他们指向一个坏URL,我的库将以优雅的方式处理它.

我正在尝试以下作为实验,

var img = document.createElement('img');
  img.__proto__.onerror = function() {
    alert('hi');
  };
  document.body.innerHTML = '<img id="foo" src="bar.png"/>'
Run Code Online (Sandbox Code Playgroud)

文件bar.png不存在但不起作用.

但是,如果我只是做类似的事情

  document.body.innerHTML = '<img id="foo" src="bar.png" ' +
    'onerror="this.src = MODIT.getImage(\'blackTile\').src;"/>';
Run Code Online (Sandbox Code Playgroud)

工作正常.这里MODIT.getImage()是一个返回图像元素的函数.你可以在这里玩这个代码:https://mod.it/ciR_BxqJ/

我正在尝试做什么?或者有没有办法全局捕获所有403 GET错误并以某种方式使用javascript处理它们?

谢谢!

Vla*_*lad 6

window.addEventListener("error", function(e) {
    if ( e && e.target && e.target.nodeName && e.target.nodeName.toLowerCase() == "img" ) {
        alert( 'Bad image src: ' + e.target.src);
    }
}, true);
Run Code Online (Sandbox Code Playgroud)

请参阅:http://jsfiddle.net/Vudsm/

  • IMO,这比你需要的更具防御性.任何支持`addEventListener`的浏览器都支持`e`参数和`e.target`和`e.target.nodeName`,并将返回所有大写的标签名称. (2认同)