让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的Theme和Theme Switcher使用小结
Sep 08 Javascript
JS onmousemove鼠标移动坐标接龙DIV效果实例
Dec 16 Javascript
node.js中的fs.chmodSync方法使用说明
Dec 18 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
Dec 14 Javascript
利用yarn实现一个webpack+react种子
Oct 25 Javascript
react-native ListView下拉刷新上拉加载实现代码
Aug 03 Javascript
详解升级react-router 4 踩坑指南
Aug 14 Javascript
JavaScript输入分钟、秒倒计时技巧总结(附代码)
Aug 17 Javascript
Node调用Java的示例代码
Sep 20 Javascript
js使用cookie实现记住用户名功能示例
Jun 13 Javascript
vue cli3适配所有端方案的实现
Apr 13 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
Aug 14 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
ThinkPHP3.1新特性之G方法的使用
2014/06/19 PHP
Laravel 4.2 中队列服务(queue)使用感受
2014/10/30 PHP
Document对象内容集合(比较全)
2010/09/06 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
CSS3,HTML5和jQuery搜索框集锦
2014/12/02 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
百度地图api如何使用
2015/08/03 Javascript
jquery的幻灯片图片切换效果代码分享
2015/09/07 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
vue中各选项及钩子函数执行顺序详解
2018/08/25 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
2019/10/25 Javascript
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
js实现直播点击飘心效果
2020/08/19 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
利用node.js开发cli的完整步骤
2020/12/29 Javascript
python两种遍历字典(dict)的方法比较
2014/05/29 Python
python实现在图片上画特定大小角度矩形框
2018/10/24 Python
python如何统计代码运行的时长
2019/07/24 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
Python中zip函数如何使用
2020/06/04 Python
python中操作文件的模块的方法总结
2021/02/04 Python
美国最受欢迎的度假租赁网站:VRBO
2016/08/02 全球购物
Gap加拿大官网:Gap Canada
2017/08/24 全球购物
个人工作主要事迹
2014/05/08 职场文书
2014组织生活会方案
2014/05/19 职场文书
教师节标语大全
2014/10/07 职场文书
谢师宴邀请函
2015/02/02 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
大学军训心得体会800字
2016/01/11 职场文书
复制别人的成功真的会成功吗?
2019/10/17 职场文书
spring 项目实现限流方法示例
2022/07/15 Java/Android