2009-12-16 188 views
1

下面的函數不工作,因爲我認爲它應該有。出於某種原因,只要validate函數返回false,循環就會中斷。這是爲什麼?Javascript行爲怪異

這裏是我的代碼:

function validateGroup(input) { 
    if (!input.value.match(/^[0-9]{0,2}$/)) { 
     $(input).addClass("invalidField"); 
     return false; 
    } 
    $(input).removeClass("invalidField"); 
    return true; 
} 

function validateClass(input) { 
    if (!input.value.match(/^[a-zA-Z0-9-]{0,9}$/)) { 
     $(input).addClass("invalidField"); 
     return false; 
    } 
    $(input).removeClass("invalidField"); 
    return true;  
} 

function validateData() { 
    var rows = document.getElementsByTagName("tbody")[0].getElementsByTagName("tr"); 

    var valid = true; 

    for (var i = 0, arrayLength = rows.length; i < arrayLength; ++i) { 
     valid = valid && validateClass(rows[i].getElementsByTagName("input")[0]); 
     valid = valid && validateGroup(rows[i].getElementsByTagName("input")[1]); 
     valid = valid && validateGroup(rows[i].getElementsByTagName("input")[2]);  
    } 
    return valid; 
} 

非常感謝!

+0

你是什麼意思的「休息」?當其中一個驗證函數返回'false'時,答案將是'false',因爲你只對其進行'&&'操作。 – 2009-12-16 15:21:43

+0

哪個函數中斷,哪個函數返回false? – Upperstage 2009-12-16 15:22:09

+0

使用螢火蟲,並通過它 – karoberts 2009-12-16 15:22:35

回答

12

聲明有效& &如果valid爲false,則validateClass(...)將不會調用validateClass方法。我想你想要做的是改變這些的以

valid = validateClass(rows[i].getElementsByTagName("input")[0]) && valid; 
valid = validateGroup(rows[i].getElementsByTagName("input")[1]) && valid; 
valid = validateGroup(rows[i].getElementsByTagName("input")[2]) && valid; 

JavaScript不打擾評價一個& &表達式的其餘部分,如果它已經知道結果是假的。

+0

我知道&&操作符是如何工作的,但不知何故,我根本沒有想到這個! – 2009-12-16 15:27:40

+0

Aaarg,在短路操作中使用副作用。每個人都知道你不應該這樣做,但仍然會發生:)偉大的觀察! – extraneon 2009-12-16 15:29:21

+0

不錯......我甚至都沒想到! +1 – 2009-12-16 15:32:38

0

聽起來這是該功能的意圖。三線

valid = valid && validate... 

意味着,如果有任何的驗證功能不斷命中假valid仍將是循環的其餘部分假的。

+0

當然,我想有效保持假,但其餘的驗證功能從來沒有被調用,即使我仍然希望他們! – 2009-12-16 15:23:46

2

即使'valid'已被設置爲false,它看起來好像要在每次迭代中運行驗證函數。但是您正在使用的操作將會短路,因此雖然循環將繼續,但驗證函數將不會在隨後的迭代中調用。

一個非常簡單的替代這將工作,你想會是這樣:

for (var i = 0, arrayLength = rows.length; i < arrayLength; ++i) { 
    if(!validateClass(rows[i].getElementsByTagName("input")[0])) valid = false; 
    if(!validateGroup(rows[i].getElementsByTagName("input")[1])) valid = false; 
    if(!vvalidateGroup(rows[i].getElementsByTagName("input")[2])) valid = false; 
} 
0

這就是所謂的短路。快速修復:用每個行代替

valid = validateClass(rows[i].getElementsByTagName("input")[0]) && valid;