昨晚,我做了一个快速的尝试,尝试在我的 GXT 应用程序中实现用户名/密码自动完成。“自动完成”不是指 Ajax 风格的自动完成,而是基于浏览器的自动完成。我通过谷歌找到的最佳信息在以下帖子中:
http://osdir.com/ml/GoogleWebToolkit/2009-04/msg01838.html
我没有使用这种技术,因为我使用的是 GXT,并且不想丢失登录表单的外观。
我成功地让一切都在 Firefox 中工作(它填充了用户名和密码)。在 IE 中,它只填充用户名,而不是密码。在 Safari/Chrome 中,它根本不起作用。
我是这样做的:
- 在嵌入 GWT 的 HTML 页面上创建了一个隐藏的 HTML 表单。
<form method="post" action="javascript:void(0)" style="display: none"> <input type="text" id="username" name="username" value=""/> <input type="password" id="password" name="password" value=""/> <input type="submit" value="Login" id="login"/> </form>
- 当用户单击我的 GWT 应用程序中的“登录”按钮时,填充此隐藏表单中的字段并“单击”登录按钮(由于 action="javascript:void(0)" 不会执行任何操作。
// 设置隐藏字段触发浏览器记住 DOM.getElementById("username").setAttribute("value", username.getValue()); DOM.getElementById("password").setAttribute("value", password.getValue()); clickFormLogin(); ... public static native void clickFormLogin() /*-{ $doc.getElementById("登录").click(); }-*/;
这适用于 Firefox 3.5,并提示我在屏幕顶部保存用户/密码。我相信我知道为什么这在 Safari/Chrome 中不起作用,那是因为表单的操作不会去任何地方并且表单没有提交。如果我将操作更改为实际 URL 并显示表单,单击表单的登录按钮会将其保存在这些浏览器中。
在这里输入这个问题后,我开始认为这可能是一篇很好的博客文章。因此,我复制了所有内容并在我的博客中添加了一些内容:
http://raibledesigns.com/rd/entry/browser_based_username_password_autocomplete
总结和问题
虽然我很高兴它可以在 Firefox 中运行,但我对 IE 缺少密码自动完成功能感到失望。最重要的是,我不禁想到有一种方法可以在基于 WebKit 的浏览器中完成这项工作。
任何人都知道如何在 GWT(特别是 GXT)中实现跨浏览器用户名/密码自动完成?