我的代码几乎可以说明我将要实现的目标,但只是为了澄清......
我希望在长按(mousedown为200ms)后返回输入值。
它完全在for循环之外工作,但在循环内部似乎没有。
对于this.value
,它返回undefined,对于gangina[i].value
,它没有返回任何内容。
这是jsFiddle:
http://jsfiddle.net/hezi_gangina/nxao19oc/
这是我的代码:
<input type=button value=1>
<input type=button value=2>
<script>
var hezi;
var gangina=document.getElementsByTagName("input");
alert(gangina[1].value); //THIS IS OK! :)
for(i=0;i<gangina.length;i++)
{
gangina[i].onmousedown=function()
{
hezi=setTimeout
(
function()
{
alert('this = '+this.value); // = undefined
alert('gangina['+i+'] = '+gangina[i].value); // = nothing
},200
);
}
}
</script>
这里需要小调整......
答案 0 :(得分:1)
<强> DEMO 强>
您可能需要将函数包装在IIFE中,该函数将绑定i
值。
由于内部mousedown事件处理程序将在某个时刻执行,它将只记住i
的最后一个值。另请注意,您也忘了在我面前提及var
。
如果要分配正确的i
值,最好将内部函数包装在IIFE函数中,现在该事件处理程序将引用当前作用域i
。因此,它将始终记住i
的正确值。
for(var i=0;i<gangina.length;i++)
{
(function(i) {
gangina[i].onmousedown=function()
{
var that = this;
hezi=setTimeout
(
function()
{
alert('this = '+that.value); // = undefined
alert('gangina['+i+'] = '+gangina[i].value); // = nothing
},200
);
}
})(i);
}
同样在setTimeout
内,this
将引用Window
对象而不是DOM元素。