javascript如何使用参数来解决回调问题

时间:2016-09-22 12:48:45

标签: javascript parameters reference callback

我遇到了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=3content是html元素的id

并且回调函数check(my_num)是:

        function check(my_num) {
            var content = "content"+my_num;
        }

然后我尝试通过键盘输入触发此功能。

然而,我通过我的broswer的调试器得到content=content4的结果,即使监听元素是content0

我已尝试过,例如$.extend({},i) $.extend(true,{},i)

没有区别

现在我对这个问题一无所知,我怎样才能传递一个值但没有引用回调函数的参数?

2 个答案:

答案 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));});  

需要传递给keyupkeydown的是在键盘事件发生时需要调用的函数。

传递给keyupkeydown的内容是调用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;
        }

不优雅但有用。