我有以下代码在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不再具有该语法了吗?
答案 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
landing-header.php(包括jQuery-1.6.4.min.js和滑块代码)
landing-page.php(包括landing-header.php,包含jQuery.js (jQuery 1.3.2)和表单验证代码 - 包括密码字段)
因此我们使用landing-page.php来测试页面(还包括landing-header.php)。
问题是,当我们包含jQuery 1.3.2时,密码标签会重新出现,但来自landing-header.php的滑块不起作用。
当我们删除include jQuery 1.3.2时,滑块动画效果很好,但即使使用你的代码,密码标签也不会重新出现。