我遇到了javascript的回调问题,我的代码看起来很简单:
var i =0;
for (; i < listSize+1; i++) {
var content = "content"+i;
$("#" + content).focus(function () {
$("#" + content).keydown(check(new Number(i)));
$("#" + content).keyup(check(new Number(i)));
});
}
我的测试用例中的lisetSize=3
和content
是html元素的id
并且回调函数check(my_num)
是:
function check(my_num) {
var content = "content"+my_num;
}
然后我尝试通过键盘输入触发此功能。
然而,我通过我的broswer的调试器得到content=content4
的结果,即使监听元素是content0
我已尝试过,例如$.extend({},i)
$.extend(true,{},i)
没有区别
现在我对这个问题一无所知,我怎样才能传递一个值但没有引用回调函数的参数?
答案 0 :(得分:1)
您没有正确声明处理程序。
替换:
$("#" + content).keydown(check(new Number(i)));
$("#" + content).keyup(check(new Number(i)));
使用:
$("#" + content).keydown(function(){check(new Number(i));});
$("#" + content).keyup(function(){check(new Number(i));});
您需要传递给keyup
和keydown
的是在键盘事件发生时需要调用的函数。
传递给keyup
和keydown
的内容是调用check(new Number(i))
的结果。
此外,由于您在循环中声明这些,因此您需要将数字复制到新变量,以便引用当前循环迭代的值:
$("#" + content).focus(function () {
var currentNumber = i;
$("#" + content).keydown(function(){check(currentNumber);});
$("#" + content).keyup(function(){check(currentNumber);});
});
答案 1 :(得分:0)
感谢Cerbrus,即使仍有问题。
现在我意识到问题是由于误解了真实的运行顺序造成的。
即使在循环结束后,一旦用户点击元素,仍然会调用$("#" + content).focus
。然后,程序启动代码
function () {
$("#" + content).keydown(function(){check(currentNum);});
$("#" + content).keyup(function(){check(currentNum);});
}
当循环结束时,currentNum=4
,所以一切都出错了。
这是我的解决方案:
for (var i = 0; i < listSize + 1; i++) {
var content = "content" + i;
$("#" + content).focus(function () {
$(this).keydown(function () {
check($(this));
});
$(this).keyup(function () {
check($(this));
});
});
}
function check(trigger) {
var my_num = getContentNum(trigger);
}
function getContentNum(content) {
return (content.attr("id").charCodeAt(7))-48;
}
不优雅但有用。