让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 Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
Mar 16 Javascript
jquery判断密码强度的验证代码
Apr 22 Javascript
JavaScript对象数组排序函数及六个用法
Dec 23 Javascript
ES6通过babel转码使用webpack使用import关键字
Dec 13 Javascript
详解Angualr 组件间通信
Jan 21 Javascript
Vue监听数组变化源码解析
Mar 09 Javascript
jQuery自定义多选下拉框效果
Jun 19 jQuery
javascript修改浏览器title方法 JS动态修改浏览器标题
Nov 30 Javascript
浅析Visual Studio Code断点调试Vue
Feb 27 Javascript
jQuery动态移除与增加onclick属性的方法详解
Jun 07 jQuery
vue制作抓娃娃机的示例代码
Apr 17 Javascript
Antd的table组件表格的序号自增操作
Oct 27 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
ThinkPHP令牌验证实例
2014/06/18 PHP
php实现只保留mysql中最新1000条记录
2015/06/18 PHP
如何在旧的PHP系统中使用PHP 5.3之后的库
2015/12/02 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
python进程与线程小结实例分析
2018/11/11 PHP
ExtJs3.0中Store添加 baseParams 的Bug
2010/03/10 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
node.js开机自启动脚本文件
2014/12/24 Javascript
React.js入门学习第一篇
2016/03/30 Javascript
JS防止网页被嵌入iframe框架的方法分析
2016/09/13 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
2017/02/14 Javascript
详解JavaScript数组过滤相同元素的5种方法
2017/05/23 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
jquery判断滚动条距离顶部的距离方法
2018/09/05 jQuery
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
JQuery事件冒泡和默认行为代码实例
2020/05/13 jQuery
python实现爬虫下载美女图片
2015/07/14 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
简单了解python代码优化小技巧
2019/07/08 Python
Python super()方法原理详解
2020/03/31 Python
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
英国最大的网上药品商店:Chemist Direct
2017/12/16 全球购物
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
工程售后服务承诺书
2014/05/21 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
财务人员入职担保书
2015/09/22 职场文书
《实心球》教学反思
2016/02/23 职场文书
60条职场经典语录,总有一条能触动你的心
2019/08/21 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书
用Python实现屏幕截图详解
2022/01/22 Python
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python