我正在尝试向数组添加项目,但我似乎无法实现它。如果我不包含“this.results.push(res)”,结果将显示在我的html页面中,但如果包括它则没有任何反应!你能帮忙吗?
这是我当前的代码:
var results = [];
var fun1 = function(str1) {
var imag = new Image;
var starttimer = new Date().getTime();
$(imag).attr('src', str1 + ':8886/').error(function () {
var endtimer = new Date().getTime();
res = (endtimer - starttimer);
this.results.push(res);
$('#results').html("" + res + "ms");
});
}
答案 0 :(得分:2)
您需要更改:
this.results.push(res);
为:
results.push(res);
答案 1 :(得分:1)
你必须使用'results.push(res)'而不是'this.results.push(res)'的原因是'this'的上下文已经改变,并且它没有指向全局上下文任何更多(定义结果数组)。 相反,这指向触发错误事件的图像元素。 另请注意'fun1'的'this'上下文将取决于调用对象。如果在全局范围内调用它,那么将定义'this.results',否则它将是未定义的(在fun1的范围内)。此外,这还取决于函数是在“严格”还是“非严格”模式下定义的事实。
假设您有三个不同的图像元素,并且所有函数中的相同错误事件处理程序“this”在所有函数中都会有所不同。实际上在每个函数中,“this”将对应于触发错误事件(image1,image2或image3)的DOM元素,因为Felix Kling已在评论中写入。
另外,我想指出你实际上可以有一个有效的错误事件处理函数,其中'this.results'可以工作。要实现这一点,您必须使用'call','apply'或'bind'方法调用错误事件处理函数,这些方法允许您更改函数内部的上下文。
你可以说:
// define your onError event handler
var onError = function () {
var endtimer = new Date().getTime();
res = (endtimer - starttimer);
this.results.push(res);
$('#results').html("" + res + "ms");
};
// now call it this way
$(imag).attr('src', str1 + ':8886/').error(onError.bind(this));
当然,这种方式使用'this'你无法访问你的图像属性,因为它的上下文已经改变了(在你的例子中你没有使用图像属性,所以这里没有坏处。)
为了更好地理解javascript全局和函数上下文,请在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this上阅读更多内容。
希望这有帮助。
答案 2 :(得分:0)
当您在代码浏览器中包含this.results.push(res);
时,该行停止并且不继续执行后续字符串。在该回调函数中未定义this.results
(检查浏览器的状态栏是否有异常通知)。删除该行时,所有内容都很好,$('#results').html("" + res + "ms");
命令会在您的html中显示数据。
使用results.push(res);
代替this.results.push(res);
,因为results
变量是全局变量且可用于回调函数。