0

登録フォームを作成していますが、ユーザー名が利用可能で、パスワードが十分に複雑で、確認パスワードが最初のパスワードと一致する場合に送信ボタンを有効にする JavaScript 部分に問題があります。何らかの理由passwordStrongで常に false であり、passwordsMatch常に未定義です。

userNameAvailable = false
passwordStrong = false
passwordsMatch = false
submitButton = null;

function checkAvailability(name, avalabilityDiv)
{
    if(name.length == 0)//this happens when a name is entered but backspaced OR the shift key is pressed (and nothing else)
    {
        avalabilityDiv.innerHTML = "Please enter a name"
        userNameAvailable = false
    }
    else
    {
        var xmlhttp, responseText
        if(window.XMLHttpRequest)
        {// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        }
        else
        {// code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange=function()
        {
            if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
            {
                responseText = xmlhttp.responseText;
                avalabilityDiv.innerHTML = responseText//responseText is the property of XMLHttpRequest object that holds server's response
                if(responseText == "available")
                    userNameAvailable = true
                else
                    userNameAvailable = false
            }
        }
        xmlhttp.open("GET", "process.php?pName="+name,true);
        xmlhttp.send();
    }
}

/*
Checks if password contains at least two characters from at least two categories: letter, number, other
sets passwordStrong true if does, otherwise false
*/
function passwordStrength(pass, strengthDiv)
{
    if(pass.length < 8)//check passwords length
    {
        strengthDiv.innerHTML = "too short!"
        //passwordStrong = false
        return
    }
    var group = [0, 0, 0, 0]
    for(i = 0, c = pass.charAt(0); i < pass.length; ++i, c = pass.charAt(i))
        group[typeOfChar(c)]++

    var result = 0
    for(var i = 0; i < group.length; i++)
        if(group[i] >= 2)
            result++

    if(result >= 2)
    {
        var passwordStrong = true
        strengthDiv.innerHTML = "Good."
        alert("passwordStrong: "+passwordStrong)
    }
    else
    {
        //var passwordStrong = false
        strengthDiv.innerHTML = "too simple!"
    }
}

/*used by isPasswordStrong()*/
function typeOfChar(c)
{
    var ascii = c.charCodeAt(0)

    if(ascii >= 48 && ascii <= 57)//is a digit
        return 0
    else if(ascii >= 65 && ascii <= 90)//is upper case letter
        return 1
    else if(ascii >= 97 && ascii <= 122)//is lower case letter
        return 2
    else//is other character(e.g. grammar character)
        return 3
}

/*
Checks to see if confirmation password is same as first password
sets passwordsMatch true if same, otherwise false
*/
function matchPasswords(first, second, matchDiv)
{
    matchDiv.innerHTML = "first: "+first.value+" second: "+second.value+"<br />"+userNameAvailable+" "+passwordStrong+" "+passwordsMatch+" done"
    if(first.value == second.value)
        var passwordsMatch = true
    else
        var passwordsMatch = false
}

/*This always shows that passwordStrong is false*/
function output()
{
    alert("From output() passwordStrong: "+passwordStrong)
}

function toggleSubmit()
{
    alert("here1 passwordStrong: "+passwordStrong)
    if(submitButton == null)//may be cached
        submitButton = document.getElementById("submit")
    if(userNameAvailable && passwordStrong && passwordsMatch)
        submitButton.disabled = false
    else
        submitButton.disabled = true
}

HTMLが「Good.」であっても。passwordStrength()関数が終了した後、変数passwordStrongが falseになることによって表示されます。なんで?

私はJQueryを使用していません。

編集:ええ、それはそれを修正しました。どうやって知ったの?私のトラブルシューティング手法のすべてが、この情報源を見つけられませんでした。

4

3 に答える 3

4

var関数内でこれらの変数を参照するときは、キーワードを削除してください。

を使用すると、比較的グローバルな変数と同じ名前のローカルvar変数を作成するため、グローバル変数は「シャドウ」されます。

于 2013-02-26T00:55:46.303 に答える
1

varどこにいてもローカルスコープに変数を作成します(あなたの場合、通常は関数内)。これにより、グローバル変数を含む、より高いスコープの変数がオーバーロードされます。代わりに、varすべての「グローバル」変数の最初に使用し、var他のスコープでは二度と使用しないでください。

于 2013-02-26T00:56:11.723 に答える
1

passwordStrength 関数のローカル スコープで新しい変数 passwordStrong を宣言したため、passwordStrength 関数はグローバル変数「passwordStrong」に決して触れません。

if(result >= 2)
{
    var passwordStrong = true // i mean this one...
    strengthDiv.innerHTML = "Good."
    alert("passwordStrong: "+passwordStrong)
}

以下のように置き換える必要があります

if(result >= 2)
{
    passwordStrong = true;
    strengthDiv.innerHTML = "Good."
    alert("passwordStrong: "+passwordStrong)
}
于 2013-02-26T00:57:17.750 に答える