让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 相关文章推荐
关于js获取radio和select的属性并控制的代码
May 12 Javascript
jQuery代码优化 选择符篇
Nov 01 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
Mar 28 Javascript
Node.js中使用计时器定时执行函数详解
Aug 15 Javascript
node.js中的fs.symlink方法使用说明
Dec 15 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
Dec 02 Javascript
js倒计时简单实现方法
Dec 17 Javascript
js获取元素的外链样式的简单实现方法
Jun 06 Javascript
easyui取消表单实时验证,提交时统一验证的简单实例
Nov 07 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
Nov 09 Javascript
微信小程序实现带放大效果的轮播图
May 26 Javascript
ajax请求前端跨域问题原因及解决方案
Oct 16 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面向对象全攻略 (三)特殊的引用“$this”的使用
2009/09/30 PHP
easyui的tabs update正确用法分享
2014/03/21 PHP
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
javascript面向对象之Javascript 继承
2010/05/04 Javascript
纯css+js写的一个简单的tab标签页带样式
2014/01/28 Javascript
Javascript基础教程之for循环
2015/01/18 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
2016/10/26 Javascript
如何获取元素的最终background-color
2017/02/06 Javascript
详解nodejs异步I/O和事件循环
2017/06/07 NodeJs
基于nodejs的微信JS-SDK简单应用实现
2019/05/21 NodeJs
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
[44:01]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS paiN
2018/03/31 DOTA
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
Python字符编码判断方法分析
2016/07/01 Python
Python中的sort()方法使用基础教程
2017/01/08 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
Python实现简单的语音识别系统
2017/12/13 Python
python机器学习实战之树回归详解
2017/12/20 Python
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
python利用smtplib实现QQ邮箱发送邮件
2020/05/20 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
中专毕业生自荐信范文
2013/11/28 职场文书
高中课程设置方案
2014/05/28 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书
Python中else的三种使用场景
2021/06/16 Python
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS