让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实现瀑布流展现照片(自动适应窗口大小)
Apr 08 Javascript
5个可以帮你理解JavaScript核心闭包和作用域的小例子
Oct 08 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
Apr 01 Javascript
AngularJS入门教程之模块化操作用法示例
Nov 02 Javascript
JavaScript组件开发之输入框加候选框
Mar 10 Javascript
浅谈js中的this问题
Aug 31 Javascript
如何为vue的项目添加单元测试
Dec 19 Javascript
Vue 处理表单input单行文本框的实例代码
May 09 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
Apr 03 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
May 11 Javascript
vue实现信息管理系统
May 30 Javascript
通过实例了解JS执行上下文运行原理
Jun 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实现的简单组词算法示例
2018/04/10 PHP
PHP实现的超长文本分页显示功能示例
2018/06/04 PHP
在laravel中实现ORM模型使用第二个数据库设置
2019/10/24 PHP
JAVASCRIPT HashTable
2007/01/22 Javascript
Exitjs获取DataView中图片文件名
2009/11/26 Javascript
javascript 自动填写表单的实现方法
2010/04/09 Javascript
JS文本框不能输入空格验证方法
2013/03/19 Javascript
js带点自动图片轮播幻灯片特效代码分享
2015/09/07 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
2015/11/24 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
BootStrap中Table分页插件使用详解
2016/10/09 Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
2018/03/10 Javascript
ES6 Symbol数据类型的应用实例分析
2019/06/26 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
react实现同页面三级跳转路由布局
2019/09/26 Javascript
Vue.js自定义指令学习使用详解
2019/10/19 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
使用python爬取微博数据打造一颗“心”
2019/06/28 Python
使用Filter过滤python中的日志输出的实现方法
2019/07/17 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
Python 数据的累加与统计的示例代码
2020/08/03 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
ABOUT YOU罗马尼亚:超过600个时尚品牌
2019/09/19 全球购物
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
护士自荐信怎么写
2013/10/18 职场文书
给老婆的搞笑检讨书
2014/01/12 职场文书
领导班子群众路线与四风问题对照检查材料思想汇报
2014/10/11 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
医者仁心观后感
2015/06/17 职场文书