0

我正在构建一个注册表单,并且当用户名可用、密码足够复杂且确认密码与第一个密码匹配时启用提交按钮的 JavaScript 部分有问题。由于某种原因passwordStrong总是错误的并且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 “好”。passwordStrength()在函数退出后显示,变量passwordStrong变为假。为什么?

我没有使用 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 回答