让angularjs支持浏览器自动填表


Posted in Javascript onNovember 10, 2014

最近有很多前端同学都抱怨说,登陆表单都不能记录自己的账号。这对于用单页面(single-page applications)和使用ajax比较多的网页来说,还是一个蛮普遍的问题。

UserApp是一个使用angularjs构建的WebApp,但是他一直未能支持浏览器的"save password"特性。
下面就列出了一些发现的问题:

表单不能用js动态的插入DOM。
表单必须真正的发出一个POST请求。(不能获取表单内容,然后用ajax发出请求)
当浏览器自动填表后,$scope并不能获得更新后的数据。
Firefox相对来说简单一点,只要表单元素有name属性,触发提交事件之后,它就会自动提醒用户是否记录数据。

<form name="login-form" ng-submit="login()">

    <input id="login" name="login" type="text" ng-model="user.login">

    <input id="password" name="password" type="password" ng-model="user.password">

</form>

firefox记录数据的要求比较简单

让angularjs支持浏览器自动填表

但是firefox有一个问题,在自动填表之后,$scope里的数据并不会更新。所以我google了一下,发现了一些针对此问题的hacks。但是总感觉这些解决方案没必要,因为我需要的只是在提交表单的时候将数据带上,而不是一些很溜逼的数据双向绑定技术。所以我就采用了很简单的办法:在提交表单的时候获取表单元素的值。

$scope.login = function() {

    $scope.user = {

        login: $("#login").val(),

        password: $("#password").val()

    };

    ...

    return false;

};

OK,现在firefox没问题了,但是chrome怎么办呢?

chrome只有在form表单真正发起POST请求的时候才会提示用户是否储存密码,但这样的话就不能用Ajax操作了。

下面是解决办法:

当表单发出Post请求时,用ng-submit截取,返回false将其阻止,同时用ajax提交数据。
当ajax成功返回时,将session储存在cookies里,再将表单重新提交一边。
页面重载的时候会发现已经认证过了,就将其重定向到主页。
这会让页面刷新一次,但也就是登录的时候需要刷新而已,确保页面返回时是同一个地址就行了。
但如果表单是被动态添加进DOM的时候,这个方法仍然不行。解决方案就是在index.html中添加一个隐藏的表单,需要提交数据的时候就将其它表单携带的数据复制到隐藏表单里。

我将它打包成了一个directive:

app.directive("ngLoginSubmit", function(){

return {

    restrict: "A",

    scope: {

        onSubmit: "=ngLoginSubmit"

    },

    link: function(scope, element, attrs) {

        $(element)[0].onsubmit = function() {

            $("#login-login").val($("#login", element).val());

            $("#login-password").val($("#password", element).val());
            scope.onSubmit(function() {

                $("#login-form")[0].submit();

            });

            return false;

        };

    }

};

});

在index.html里隐藏的表单:

<form name="login-form" id="login-form" method="post" action="" style="display: none;">

    <input name="login" id="login-login" type="text">

    <input name="password" id="login-password" type="password">

</form>

临时登录表单

<form name="login-form" autocomplete="on" ng-login-submit="login">

    <input id="login" name="login" type="text" autocomplete="on">

    <input id="password" name="password" type="password" autocomplete="on">

</form>

登录用的controller:

$scope.login = function(submit) {

    $scope.user = {

        login: $("#login").val(),

        password: $("#password").val()

    };
    function ajaxCallback() {

        submit();

    }  
    return false;

};

刷新时会提示是否重新提交表单

让angularjs支持浏览器自动填表

现在这个问题解决了,但是每当你按下f5的时候,浏览器都会提醒你要不要重新提交表单。这确实有点蛋疼,所以我添加了一个pre-login.html文件,隐藏的表单会提交数据到这里,然后再重定向到index.html。

现在OK了~

Javascript 相关文章推荐
简单三步,搞掂内存泄漏
Mar 10 Javascript
JS获取scrollHeight问题想到的标准问题
May 27 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
Jan 22 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
Mar 13 Javascript
jQuery简单实现中间浮窗效果
Sep 04 Javascript
原生js图片轮播效果实现代码
Oct 19 Javascript
AngularJS双向绑定和依赖反转实例详解
Apr 15 Javascript
JS简单实现自定义右键菜单实例
May 31 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
Jun 17 Javascript
浅析node.js的模块加载机制
May 25 Javascript
详解使用angular框架离线你的应用(pwa指南)
Jan 31 Javascript
Vue实现todo应用的示例
Feb 20 Vue.js
使用cluster 将自己的Node服务器扩展为多线程服务器
Nov 10 #Javascript
前端必备神器 Snap.svg 弹动效果
Nov 10 #Javascript
浅谈JavaScript 框架分类
Nov 10 #Javascript
使用script的src实现跨域和类似ajax效果
Nov 10 #Javascript
jquery插件推荐 jquery.cookie
Nov 09 #Javascript
jquery插件推荐浏览器嗅探userAgent
Nov 09 #Javascript
Javascript限制网页只能在微信内置浏览器中访问
Nov 09 #Javascript
You might like
全国FM电台频率大全 - 20 广西省
2020/03/11 无线电
PHP警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
php使用MySQL保存session会话的方法
2015/06/26 PHP
利用“多说”制作留言板、评论系统
2015/07/14 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
Javascript模块化编程(一)AMD规范(规范使用模块)
2013/01/17 Javascript
JS 加入收藏夹的代码(主流浏览器通用)
2013/05/13 Javascript
21个值得收藏的Javascript技巧
2014/02/04 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
jQuery中$.each()函数的用法引申实例
2016/05/12 Javascript
Vue框架中正确引入JS库的方法介绍
2017/07/30 Javascript
React进阶学习之组件的解耦之道
2017/08/07 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
ejsExcel模板在Vue.js项目中的实际运用
2018/01/27 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
使用pm2部署node生产环境的方法步骤
2019/03/09 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
[56:48]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[03:21]【TI9纪实】Old Boys
2019/08/23 DOTA
Python 冒泡,选择,插入排序使用实例
2015/02/05 Python
Windows下PyCharm安装图文教程
2018/08/27 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
Django视图、传参和forms验证操作
2020/07/15 Python
娇韵诗加拿大官网:Clarins加拿大
2017/11/20 全球购物
sort命令的作用和用法
2013/08/25 面试题
销售业务员岗位职责
2014/01/29 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
代理协议书范本
2014/04/22 职场文书
导游词之江苏同里古镇
2019/11/18 职场文书
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
2021/05/05 Golang
python中的3种定义类方法
2021/11/27 Python
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers
【海涛dota解说】海涛小满开黑4v5被破两路翻盘潮汐第一视角解说
2022/04/01 DOTA
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL