让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实现点击同时更改两个iframe的网址
Jul 01 Javascript
javascript 实现简单的table排序及table操作练习
Dec 28 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
Dec 03 Javascript
将List对象列表转换成JSON格式的类实现方法
Jul 04 Javascript
require简单实现单页应用程序(SPA)
Jul 12 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
Aug 30 Javascript
vue.js删除动态绑定的radio的指定项
Jun 02 Javascript
jQuery封装placeholder效果实现方法,让低版本浏览器支持该效果
Jul 08 jQuery
Vue 将后台传过来的带html字段的字符串转换为 HTML
Mar 29 Javascript
vue 1.0 结合animate.css定义动画效果
Jul 11 Javascript
react 国际化的实现代码示例
Sep 14 Javascript
ionic+html5+API实现双击返回键退出应用
Sep 17 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 Squid中可缓存的动态网页设计
2008/09/17 PHP
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
个人写的PHP验证码生成类分享
2014/08/21 PHP
Smarty高级应用之缓存操作技巧分析
2016/05/14 PHP
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
Thinkphp集成抖音SDK的实现方法
2020/04/28 PHP
拖拉表格的JS函数
2008/11/20 Javascript
js中各浏览器中鼠标按键值的差异
2011/04/07 Javascript
js正则表达式的使用详解
2013/07/09 Javascript
JS实现仿中关村论坛评分后弹出提示效果的方法
2015/02/23 Javascript
jquery实现多屏多图焦点图切换特效的方法
2015/05/04 Javascript
js生成随机数的过程解析
2015/11/24 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
2016/06/10 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
JS实现对json对象排序并删除id相同项功能示例
2018/04/18 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
js实现纯前端压缩图片
2020/11/16 Javascript
python字典排序实例详解
2015/05/20 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
Python @property使用方法解析
2019/09/17 Python
通过python3实现投票功能代码实例
2019/09/26 Python
基于python实现对文件进行切分行
2020/04/26 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
如何让python的运行速度得到提升
2020/07/08 Python
基于opencv的selenium滑动验证码的实现
2020/07/24 Python
button在IE6/7下的黑边去除方案
2012/12/24 HTML / CSS
CSS3盒子模型详解
2013/04/24 HTML / CSS
RetroStage德国:复古服装
2019/02/03 全球购物
初中生三年学习生活的自我评价
2013/11/03 职场文书
房产销售独家委托书范本
2014/10/01 职场文书
民政局副局长民主生活会个人整改措施
2014/10/04 职场文书
2014年工商所工作总结
2014/12/09 职场文书
同事欢送会致辞
2015/07/31 职场文书
golang http使用踩过的坑与填坑指南
2021/04/27 Golang
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python