在onerror属性中使用闭包似乎不起作用
Using closures in onerror attribute does not seem to work
我有这段代码在一个相当大的JS文件。
function accError() {
console.log("hello there");
}
var setAccount = function(key) {
var error = function() {
accError();
};
document.body.innerHTML += "<img src='//www.somerandomdomain.in/i.jpg?key=" + key + "' onerror='error();' />"
};
setAccount("a");
如果图像加载失败,我想调用error
函数。但它给了我一个错误- error
没有定义。JSFiddle here = http://jsfiddle.net/rrvvw1sj/
在加载或错误回调图像或任何其他元素的情况下,作用域是如何工作的?不应该使用闭包访问error()
函数?
img标记找不到错误函数的原因是它没有访问闭包的作用域。
document.body.innerHTML += "<img src='//www.somerandomdomain.in/i.jpg?key=" + key + "' onerror='error();' />"
这行代码没有向文档发送任何可以链接回闭包的内容。
它发送的是一个字符串。
然后在文档的范围内解析字符串。
因为你的错误函数在全局作用域中不存在,所以它不会被找到。
你需要做的是在闭包中创建一个对象,并将error函数附加到它上面。然后,如果您将该对象发送给文档,它将保持与闭包内的error函数的连接。您可以通过使用DOM(文档对象模型)方法创建一个img元素节点,然后将该对象附加到正文中来实现这一点。
然后在闭包中有一个对元素的引用,并且可以使用addEventListener将错误函数附加到错误事件
//document.body.innerHTML += "<img src='//www.somerandomdomain.in/i.jpg?key=" + key + "' onerror='error();' />"
var img=document.createElement("img");
img.setAttribute('src', '//www.somerandomdomain.in/i.jpg?key=' + key);
img.addEventListener("error", error);
document.body.appendChild(img);
'onerror='不在闭包范围内求值,因此error()将无法访问。
如果它被求值,那么error()当然会立即被调用。
将函数外的定义移到全局作用域中,或者给图像一个id,并使用addEventListener或类似的方法将函数附加到onerror。
相关文章:
- 为什么我在谷歌闭包中编写的事件监听器不起作用
- Jquery 和闭包或函数引用不起作用
- Dojo build 1.7 构建的软件包不起作用
- AWS Javascript 开发工具包问题 - deleteObject 有效,但 deleteObject 不起作用
- DT 包:styleColorbar() 在 Android 平板电脑上不起作用
- 流星少包不起作用
- AES-KW的解包键功能在IE11中不起作用
- bower安装'dev'软件包的版本;不起作用
- 创建类时的闭包不起作用
- Javascript闭包不起作用
- VS2013-Web Essentials-“;更新所有捆绑包”;不起作用
- 闭包内部的Javascript事件处理程序“this”绑定不起作用
- 为什么在Javascript中使用闭包时mouseover事件不起作用?
- 闭包在函数作用域之外不起作用
- 在onerror属性中使用闭包似乎不起作用
- 闭包编译器@extends在使用“类”容器对象时不起作用
- 网络包.当键与模块名称相同时,ProvidePlugin 不起作用
- AngularJS: ng-controller on指令对指令内的跨包元素不起作用
- 循环中的javascript闭包不起作用
- javascript中带回调的闭包不起作用