让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 相关文章推荐
jquery.pagination.js 无刷新分页实现步骤分享
May 23 Javascript
js获取某元素的class里面的css属性值代码
Jan 16 Javascript
js读取被点击次数的简单实例(从数据库中读取)
Mar 07 Javascript
深入理解jquery中的事件与动画
May 24 Javascript
Ionic实现页面下拉刷新(ion-refresher)功能代码
Jun 03 Javascript
很棒的js选项卡切换效果
Jul 15 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
Oct 09 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
Feb 12 Javascript
php register_shutdown_function函数详解
Jul 23 Javascript
JavaScript实现微信红包算法及问题解决方法
Apr 26 Javascript
layui监听工具栏的实例(操作列表按钮)
Sep 10 Javascript
微信小程序后端实现授权登录
Feb 24 Javascript
使用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 array 的加法操作代码
2010/07/24 PHP
PHP中删除变量时unset()和null的区别分析
2011/01/27 PHP
javascript 密码强弱度检测万能插件
2009/02/25 Javascript
select标签模拟/美化方法采用JS外挂式插件
2013/04/01 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
2016/01/14 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
2017/04/19 Javascript
node.js+captchapng+jsonwebtoken实现登录验证示例
2017/08/17 Javascript
js实现图片粘贴上传到服务器并展示的实例
2017/11/08 Javascript
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
vue2.0 computed 计算list循环后累加值的实例
2018/03/07 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
2019/02/02 NodeJs
在Vue中使用this.$store或者是$route一直报错的解决
2019/11/08 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
Vue仿百度搜索功能
2020/12/28 Vue.js
[17:45]DOTA2 HEROES教学视频教你分分钟做大人-军团指挥官
2014/06/11 DOTA
Python中属性和描述符的正确使用
2016/08/23 Python
python 队列详解及实例代码
2016/10/18 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
使用python判断你是青少年还是老年人
2018/11/29 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
python如何控制进程或者线程的个数
2020/10/16 Python
一款简洁的纯css3代码实现的动画导航
2014/10/31 HTML / CSS
药学专业个人自我评价
2013/11/11 职场文书
音乐教学反思
2014/02/02 职场文书
大学生自我评价范文分享
2014/02/21 职场文书
外国人聘用意向书
2014/04/01 职场文书
我们的节日清明节活动总结
2014/04/30 职场文书
机关职员工作检讨书
2014/10/23 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
Memcached介绍及php-memcache扩展安装
2021/04/01 PHP
python 开心网和豆瓣日记爬取的小爬虫
2021/05/29 Python