我的代码适用于jQuery 1.3.2但不适用于1.6.4

时间:2012-06-03 05:41:13

标签: javascript jquery

我有以下代码在jQuery 1.3.2上完美运行:

        $("#passwordLabel").click(function()
            {
                $(this).hide();
                $("#password").focus();
            }
        );

        $("#confirmpasswordLabel").click(function()
            {
                $(this).hide();
                $("#confirmpassword").focus();
            }
        );

        $("#password").focus(function()
            {
                $("#passwordLabel").hide();
            }
        );

        $("#confirmpassword").focus(function()
            {
                $("#confirmpasswordLabel").hide();
            }
        );

        $("#password").blur(function()
            {
                if($(this).val()=="")
                {
                    $("#passwordLabel").show();
                }
            }
        );

        $("#confirmpassword").blur(function(value)
            {
                if($(this).val()=="")
                {
                    $("#confirmpasswordLabel").show();
                }
            }
        );
    });

但遗憾的是,当我将jQuery Library更改为1.6.4版本时,此代码不再起作用。

是因为jQuery 1.6.4不再具有该语法了吗?

2 个答案:

答案 0 :(得分:2)

顺便提一下你的名字。

它看起来像是JavaScript新手。我来一些指示。首先,您应该尝试减少向浏览器询问元素的次数。使用jQuery,您所要做的就是将所选元素保存到变量中。我个人喜欢用$前置我的元素变量,所以我知道有jQuery元素。

//too many selections
$('element').foo(); //query 1
$('element').bar(); //query 2
$('element').baz(); //query 3

//better
$element = $('element'); //query 1
$element.foo();
$element.bar();
$element.baz();

第二件事是你应该始终保持你的{与你的阻止开始时在同一条线上。在大多数语言中,这并不重要,在很多情况下它可以在JavaScript中工作,但由于分号插入最好保持你的{在同一条线上。

//one example of why this is bad
return
{
    "foo": "bar"
};

//The above actually becomes
return;
{
    "foo": "bar"
};

//should have actually been
return {
    "foo": "bar"
};

我注意到的最后一件事是,当点击相应的标签时,你的javascript会关注每个输入。实际上可以在没有JavaScript的情况下完成。您需要做的就是为标签添加for属性。它们应该设置为相应输入的id。

<!-- from this -->
<label id="passwordLabel">Password</label>
<input id="password" type="password">

<!-- to this -->
<label id="passwordLabel" for="password">Password</label>
<input id="password" type="password">

无论如何,如果你修复了你的html,下面应该可以解决这个问题。

//Wait for the page to load
$(function() {
    var $passwordLabel, $confirmpasswordLabel, $password, $confirmpassword;

    //Pre select the form elements
    $passwordLabel = $("#passwordLabel");
    $password = $("#password");
    $confirmpasswordLabel = $("#confirmpasswordLabel");
    $confirmpassword = $("#confirmpassword");

    //bind events for the password input
    $password.focus(function() {
        //on focus hide the label
        $passwordLabel.hide();
    });
    $password.blur(function() {
        if(!$password.val()) {
            //if the input is empty then restore the label on blur
            $passwordLabel.show();
        }
    });

    //bind events for the confirm password input
    $confirmpassword.focus(function() {
        //on focus hide the label
        $confirmpasswordLabel.hide();
    });
    $confirmpassword.blur(function() {
        if(!$confirmpassword.val()) {
            //if the input is empty then restore the label on blur
            $confirmpasswordLabel.show();
        }
    });
});​

如果你想查看一些有用的代码,我会用上面的例子和一些示例输入为你创建一个jsFiddle:http://jsfiddle.net/wef85/8/

答案 1 :(得分:0)

非常感谢您回答这个问题。

我相信以前的代码没有逻辑错误。 我应用了你的代码,它仍然行为相同...... 我认为jQuery版本1.3.2和1.6.4存在问题,因为我们同时使用它们。

让我为这个问题添加一些可能导致问题的信息:

我们正在构建一个需要使用jQuery进行验证的注册页面。在该页面上,我们还使用了jQuery滑块。

所以页面结构如下所示:

请检查此图片:http://img72.imageshack.us/img72/1111/structured.png

  1. landing-header.php(包括jQuery-1.6.4.min.js和滑块代码)

  2. landing-page.php(包括landing-header.php,包含jQuery.js (jQuery 1.3.2)和表单验证代码 - 包括密码字段)

  3. 因此我们使用landing-page.php来测试页面(还包括landing-header.php)。

    问题是,当我们包含jQuery 1.3.2时,密码标签会重新出现,但来自landing-header.php的滑块不起作用。

    当我们删除include jQuery 1.3.2时,滑块动画效果很好,但即使使用你的代码,密码标签也不会重新出现。