2012-08-08 56 views
3

我不確定是否誤解了True/False在Javascript中的工作方式。 在我的JQuery腳本下面我宣佈6個變量爲false。 如果正則表達式驗證條件是好的,那麼我重新聲明變量爲真。 底部是一個簡單的alert()告訴我什麼時候所有的變量都是真的。javascript如果變量爲真

驗證條件正在工作(刪除/添加類),但警報不顯示。這就是爲什麼我不確定我是否搞亂了真假部分。

$('#password1').keyup(function() { 
var checkLength = false; 
var checkLetter = false; 
var checkCaps = false; 
var checkNum = false; 
var checkSymbol = false; 
var checkSpace = false; 

var pswd = $(this).val(); 


//validate the length 
if(pswd.length < 6){ 
$('#length').removeClass('valid').addClass('invalid'); 
}else{ 
$('#length').removeClass('invalid').addClass('valid'); 
checkLength = true; 
} 

//validate letter 
if(pswd.match(/[A-Za-z]/)){ 
$('#letter').removeClass('invalid').addClass('valid'); 
}else{ 
$('#letter').removeClass('valid').addClass('invalid'); 
checkLetter = true; 
} 

//validate capital letter 
if(pswd.match(/[A-Z]/)){ 
$('#capital').removeClass('invalid').addClass('valid'); 
}else{ 
$('#capital').removeClass('valid').addClass('invalid'); 
checkCaps = true; 
} 

//validate number 
if(pswd.match(/\d/)){ 
$('#number').removeClass('invalid').addClass('valid'); 
}else{ 
$('#number').removeClass('valid').addClass('invalid'); 
checkNum = true; 
} 

//validate symbols 
if(pswd.match(/[^a-zA-Z0-9]/)){ 
$('#symbol').removeClass('invalid').addClass('valid'); 
}else{ 
$('#symbol').removeClass('valid').addClass('invalid'); 
checkSymbol = true; 
} 

//validate no spaces 
if(pswd.match(/\s/)){ 
$('#spaces').removeClass('valid').addClass('invalid'); 
}else{ 
$('#spaces').removeClass('invalid').addClass('valid'); 
checkSpace = true; 
} 

// here is where I'm concerned I'm wrong 
if(checkLength == true && checkLetter == true && checkCaps == true && checkNum == true && checkSymbol == true && checkSpace == true){ 
    alert("All good"); 
} 

}); 

有人會檢查我嗎?

+4

*永遠不會寫'== true'。它幾乎總是多餘的,如果不是,你的腳本需要重構。 – 2012-08-08 15:18:51

+0

你可以做一個jsfiddle嗎? – SomeKittens 2012-08-08 15:19:38

+1

我想你剛剛得到了一些錯誤的條件。例如,如果密碼包含從'a'到'z'的任何字母,則不要將'checkLetter'設置爲'true'。 '.match'如果**不匹配,則返回'null'。 – 2012-08-08 15:20:54

回答

7

起初,沒有必要編寫checkLength == truecheckLength就足夠了,因爲它們都是布爾變量。

其次,在您的某些情況下,您可以指定類invalid,但將var設置爲true,而在其他情況下,則可以將var設置爲true。每個check... = true應與class = valid位於同一分支。 此外,我個人會修改有效性條件,在ifelse分支中擁有所有積極事件,但不會像現在這樣混合使用。最後,我總是儘量避免重複的代碼。有很多地方你可以重構,但你可以輕鬆地開始在一個單獨的函數中設置類。

看到它的工作in this fiddle

$('#password1').keyup(function() { 
 
    var checkLength = false; 
 
    var checkLetter = false; 
 
    var checkCaps = false; 
 
    var checkNum = false; 
 
    var checkSymbol = false; 
 
    var checkSpace = false; 
 

 
    var pswd = $(this).val(); 
 

 

 
    //validate the length 
 
    // reverse the condition, to have the valid state in the if branch as well 
 
    if(pswd.length >= 6){ 
 
    setValid('#length'); 
 
    checkLength = true; 
 
    }else{ 
 
    setInvalid('#length'); 
 
    } 
 

 
    //validate letter 
 
    if(pswd.match(/[A-Za-z]/)){ 
 
    setValid('#letter'); 
 
    checkLetter = true; 
 
    }else{ 
 
    setInvalid('#letter'); 
 
    } 
 

 
    //validate capital letter 
 
    if(pswd.match(/[A-Z]/)){ 
 
    setValid('#capital'); 
 
    checkCaps = true; 
 
    }else{ 
 
    setInvalid('#capital'); 
 
    } 
 

 
    //validate number 
 
    if(pswd.match(/\d/)){ 
 
    setValid('#number'); 
 
    checkNum = true; 
 
    }else{ 
 
    setInvalid('#number'); 
 
    } 
 

 
    //validate symbols 
 
    if(pswd.match(/[^a-zA-Z0-9]/)){ 
 
    setValid('#symbol'); 
 
    checkSymbol = true; 
 
    }else{ 
 
    setInvalid('#symbol'); 
 
    } 
 

 
    //validate no spaces 
 
    if(!pswd.match(/\s/)){ 
 
    setValid('#spaces'); 
 
    checkSpace = true; 
 
    }else{ 
 
    setInvalid('#spaces'); 
 
    } 
 

 
    function setValid(e){$(e).removeClass('invalid').addClass('valid')} 
 
    function setInvalid(e){$(e).removeClass('valid').addClass('invalid')} 
 

 
    if(checkLength && checkLetter && checkCaps && checkNum && checkSymbol && checkSpace){ 
 
    alert("All good"); 
 
    } 
 
    console.log("keyup"); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input id="password1" type="text">

+0

您編輯的最後一點不正確。該測試適用於符號,不適用於字符串開頭的字母數字字符。 – 2012-08-08 15:29:03

+0

@Charmander ty,解決了這個問題 – Christoph 2012-08-08 15:34:14

2

所有這些都check* = true在錯誤的地方:

//validate letter 
if(pswd.match(/[A-Za-z]/)){ 
$('#letter').removeClass('invalid').addClass('valid'); 
}else{ 
$('#letter').removeClass('valid').addClass('invalid'); 
checkLetter = true; 
} 

//validate capital letter 
if(pswd.match(/[A-Z]/)){ 
$('#capital').removeClass('invalid').addClass('valid'); 
}else{ 
$('#capital').removeClass('valid').addClass('invalid'); 
checkCaps = true; 
} 

//validate number 
if(pswd.match(/\d/)){ 
$('#number').removeClass('invalid').addClass('valid'); 
}else{ 
$('#number').removeClass('valid').addClass('invalid'); 
checkNum = true; 
} 

//validate symbols 
if(pswd.match(/[^a-zA-Z0-9]/)){ 
$('#symbol').removeClass('invalid').addClass('valid'); 
}else{ 
$('#symbol').removeClass('valid').addClass('invalid'); 
checkSymbol = true; 
} 

插入下面的if(在那裏它們被認爲是有效的),如else反對(在那裏它們被視爲無效)的塊中的語句:

//validate letter 
if(pswd.match(/[A-Za-z]/)){ 
$('#letter').removeClass('invalid').addClass('valid'); 
checkLetter = true; 
}else{ 
$('#letter').removeClass('valid').addClass('invalid'); 
} 

//validate capital letter 
if(pswd.match(/[A-Z]/)){ 
$('#capital').removeClass('invalid').addClass('valid'); 
checkCaps = true; 
}else{ 
$('#capital').removeClass('valid').addClass('invalid'); 
} 

//validate number 
if(pswd.match(/\d/)){ 
$('#number').removeClass('invalid').addClass('valid'); 
}else{ 
$('#number').removeClass('valid').addClass('invalid'); 
checkNum = true; 
} 

//validate symbols 
if(pswd.match(/[^a-zA-Z0-9]/)){ 
$('#symbol').removeClass('invalid').addClass('valid'); 
checkSymbol = true; 
}else{ 
$('#symbol').removeClass('valid').addClass('invalid'); 
} 

而且,雖然有編寫驗證的更好的方法,這是你的片斷類似,但更加簡潔的版本:

$("#password1").keyup(function() { 
    var pswd = $(this).val(); 
    var checkLength = pswd.length >= 6; 
    var checkLetter = /[A-Za-z]/.test(pswd); 
    var checkCaps = /[A-Z]/.test(pswd); 
    var checkNum = /\d/.test(pswd); 
    var checkSymbol = /[^A-Za-z0-9]/.test(pswd); 
    var checkSpace = !/\s/.test(pswd); 

    $("#length") .removeClass("valid invalid").addClass(checkLength ? "valid" : "invalid"); 
    $("#letter") .removeClass("valid invalid").addClass(checkLetter ? "valid" : "invalid"); 
    $("#capital").removeClass("valid invalid").addClass(checkCaps ? "valid" : "invalid"); 
    $("#number") .removeClass("valid invalid").addClass(checkNum ? "valid" : "invalid"); 
    $("#symbol") .removeClass("valid invalid").addClass(checkSymbol ? "valid" : "invalid"); 
    $("#spaces") .removeClass("valid invalid").addClass(checkSpace ? "valid" : "invalid"); 

    if(checkLength && checkLetter && checkCaps && checkNum && checkSymbol && checkSpace) { 
     alert("All good"); 
    } 
}); 
0

對我來說,似乎你的任務是有效的語句。不管他們是否按照你想要的方式設置是另一回事。

這很可能是其中一個標誌沒有按照您希望設置的方式設置。要檢查這一點,你可以提醒每個標誌(checkCaps等),以確認每個值的設置都是你想要的。如果所有的真實/錯誤都是正確的,那麼問題將出現在最終的if語句中。

正如許多人所建議的,刪除== true是個不錯的主意。由於Javascript是動態輸入的,因此它有一個輕微的可能性,它不會將您的標誌視爲布爾值,而是作爲別的東西。

如果刪除== true不起作用,您可以檢查不同的標記對以查看哪個標記使整個語句爲false。