jquery .keyup .keypress不会触发,但在页面重新加载时调用该函数

时间:2012-03-04 13:52:22

标签: jquery

为什么以下代码不会在按键上触发但会在页面重新加载时出现这种情况?

$(document).ready(function(){

$('#weight').keypress(valNum("weight", "weight"));    

function valNum(number, clas){
    var name = $("#"+number).val();
    var reg = /^([0-9\-\ \.]{2,6})$/;
    if(!reg.test(name)){
    $("."+clas+" .nogood").show();
    $("."+clas+" .good").hide();
    }else{
    $("."+clas+" .good").show();
    $("."+clas+" .nogood").hide();
    }
}
})

3 个答案:

答案 0 :(得分:2)

变化:

$('#weight').keypress(valNum("weight", "weight"));  

要:

$('#weight').keypress(function(){
    valNum("weight", "weight");
});  

根据您之前的陈述,问题在于valNum函数由于("weight", "weight")而立即执行 。这就是你如何立即调用JS函数,例如func()。但是,keyup需要 回调 功能,这正是我们在后一种情况下提供的功能。

答案 1 :(得分:1)

你遇到的问题是你没有传递函数引用(如你所想),而是调用valNum("weight", "weight").keypress()函数的结果。

如果要使用参数调用现有函数,则需要将其包装在匿名函数中,如下所示:

$('#weight').keypress(function() {
    valNum("weight", "weight");
});    

答案 2 :(得分:1)

与任何其他函数或方法一样,jQuery的.keypress()方法接受一个参数。这是您将事件处理函数作为参数传递的位置。但是,您正在做的是 NOT 将函数valNum()作为参数传递;你实际上在执行valNum()功能。只要在函数名后面看到(),就会执行该函数。相反,您只需将valNum()函数包装在匿名的执行函数中:

$('#weight').keypress(function(){
    valNum("weight", "weight");
});

语法可能会模糊它,但我们现在传递给.keypress()方法的参数是:

function(){
    valNum("weight", "weight");
}

这是keypress事件在绑定元素上触发时调用的函数。当调用此匿名函数时,然后它会调用您的valNum()函数。

这解决了您的两个问题:valNum()不会立即执行,而是会响应keypress事件而运行。

如果您有任何问题,请告诉我 - 这涉及JavaScript中一些非常重要的主题。