2012-03-04 61 views
0

为什么下面的代码在按键时不会触发,但会在页面重新加载时触发的任何原因?jquery .keyup .keypress不启动,但在页面重新加载时调用该函数

$(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(); 
    } 
} 
}) 

回答

2

变化:

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

要:

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

与您此前的说法,问题是,valNum功能是越来越立即因为执行。这就是你如何立即调用JS函数,例如func()。然而,keyup需要一个回调功能,这正是我们在后一种情况下提供的功能。

+0

好的,这是非常有意义的,谢谢 – 2012-03-04 14:12:09

+0

@A_funs:不客气:) – Sarfraz 2012-03-04 14:12:43

1

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

如果你想调用带参数的现有功能,你需要将它包装在一个匿名函数,像这样:

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

像任何其他函数或方法,jQuery的.keypress()方法接受一个参数。这是您将事件处理函数作为参数传递的地方。但是,您所做的是NOT将函数valNum()作为参数传递;你实际上正在执行valNum()函数。任何时候您在函数名称后面看到(),都会执行该函数。相反,你只需要包裹valNum()功能在一个匿名, -executing功能:

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

语法可以掩盖它,但我们现在传递到.keypress()方法的参数是:

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

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

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

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

+0

谢谢,我想我明白了,尽管让我们说valNum不接受任何参数,并且这是代码:$('#weight “).keypress(valNum); – 2012-03-04 14:08:42

+0

为什么会这样工作 – 2012-03-04 14:08:50

+0

,因为在这种情况下,您实际上将函数传递给'.keypress()'作为参数而不是执行该函数(无括号) – maxedison 2012-03-04 19:53:37