2012-03-04 60 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