我找到了这个问题的完整解决方案。(我已经在 Chrome 27 和 Firefox 21 中测试过。)
需要知道两件事情:
- 触发“保存密码”功能,以及
- 恢复保存的用户名和密码。
1. 触发“保存密码”功能:
对于Firefox 21,当检测到一个包含输入文本框和输入密码框的表单被提交时,就会触发“保存密码”功能。所以我们只需要使用
$('#loginButton').click(someFunctionForLogin);
$('#loginForm').submit(function(event){event.preventDefault();});
someFunctionForLogin()
通过ajax登录并重新加载/重定向到已登录页面,而event.preventDefault()
阻止了由于提交表单而进行的原始重定向。
如果您只处理Firefox,则上述解决方案就足够了,但在Chrome 27中无法正常工作。然后您会问如何在Chrome 27中触发“保存密码”。
对于Chrome 27,“保存密码”是在提交包含输入文本字段属性名为'username'和输入密码字段属性名为'password'的表单后重定向到该页面时触发的。因此,我们无法阻止由于提交表单而进行的重定向,但是我们可以在完成ajax登录后进行重定向。(如果您希望ajax登录不重新加载页面或不重定向到页面,则很遗憾,我的解决方案无法解决。)然后,我们可以使用
<form id='loginForm' action='signedIn.xxx' method='post'>
<input type='text' name='username'>
<input type='password' name='password'>
<button id='loginButton' type='button'>Login</button>
</form>
<script>
$('#loginButton').click(someFunctionForLogin);
function someFunctionForLogin(){
if(/*ajax login success*/) {
$('#loginForm').submit();
}
else {
//do something to show login fail(e.g. display fail messages)
}
}
</script>
使用 type='button' 的按钮在点击时不会提交表单。然后,将一个函数绑定到按钮实现ajax登录。最后,调用 $('#loginForm').submit();
将页面重定向到已登录页面。如果已登录页面和当前页面相同,则可以将 'signedIn.xxx' 替换为当前页面以进行“刷新”。
现在,你会发现 Chrome 27 的方法也适用于 Firefox 21。因此最好使用它。
2. 恢复已保存的用户名/密码:
如果您已经在HTML中硬编码了 loginForm,则恢复已保存的密码并不会有任何问题。
但是,如果您使用js/jquery来动态创建 loginForm,保存的用户名/密码将不会绑定到 loginForm,因为只有在文档加载时才会绑定保存的用户名/密码。
因此,您需要将 loginForm 硬编码为HTML并使用js/jquery来动态移动/显示/隐藏 loginForm。
备注:
如果您使用 ajax 登录,请不要在 form 标签中添加 autocomplete='off'。
<form id='loginForm' action='signedIn.xxx' autocomplete='off'>
autocomplete='off'
会使得恢复用户名/密码到登录表单失败,因为您不允许其自动填写用户名/密码。