让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 相关文章推荐
仿百度的关键词匹配搜索示例
Sep 25 Javascript
给事件响应函数传参数的四种方式小结
Dec 05 Javascript
jquery ajax 局部刷新小案例
Feb 08 Javascript
写出高效jquery代码的19条指南
Mar 19 Javascript
javascript结合ajax读取txt文件内容
Dec 05 Javascript
JavaScript获取元素尺寸和大小操作总结
Feb 27 Javascript
javaScript实现可缩放的显示区效果代码
Oct 26 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
Dec 14 Javascript
vue.js学习之UI组件开发教程
Jul 03 Javascript
在vue-cli中组件通信的方法
Dec 16 Javascript
Vue实现返回顶部按钮实例代码
Oct 21 Javascript
Vue监视数据的原理详解
Feb 24 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
php&amp;java(二)
2006/10/09 PHP
简体中文转换为繁体中文的PHP函数
2006/10/09 PHP
PHP下常用正则表达式整理
2010/10/26 PHP
PHP新手入门学习方法
2011/05/08 PHP
php错误、异常处理机制(补充)
2012/05/07 PHP
PHP调试函数和日志记录函数分享
2015/01/31 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
2015/10/27 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
jquery下利用jsonp跨域访问实现方法
2010/07/29 Javascript
jquery div 居中技巧应用介绍
2012/11/24 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
js实现带圆角的两级导航菜单效果代码
2015/08/24 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
js将json格式的对象拼接成复杂的url参数方法
2016/05/25 Javascript
基于JavaScript实现本地图片预览
2017/02/08 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
[46:02]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第二局
2016/02/28 DOTA
[41:17]完美世界DOTA2联赛PWL S3 access vs CPG 第二场 12.13
2020/12/17 DOTA
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
2017/04/18 Python
pycharm访问mysql数据库的方法步骤
2019/06/18 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
美国生鲜及杂货电商:FreshDirect
2018/01/29 全球购物
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
一份软件工程师的面试试题
2016/02/01 面试题
机电一体化职业规划书
2014/01/07 职场文书
工程项目建议书范文
2014/03/12 职场文书
汇源肾宝广告词
2014/03/20 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
拖欠货款起诉状
2015/05/20 职场文书
Javascript使用integrity属性进行安全验证
2021/11/07 Javascript
python turtle绘制多边形和跳跃和改变速度特效
2022/03/16 Python