让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 相关文章推荐
JSON扫盲帖 JSON.as类教程
Feb 16 Javascript
25个非常棒的jQuery滑块插件和教程小结
Sep 02 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
Aug 14 Javascript
纯CSS3代码实现滑动开关效果
Aug 19 Javascript
javascript html5移动端轻松实现文件上传
Mar 27 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
Apr 13 Javascript
React复制到剪贴板的示例代码
Aug 22 Javascript
详解在express站点中使用ejs模板引擎
Sep 21 Javascript
vue中v-model的应用及使用详解
Jun 27 Javascript
浅谈JavaScript闭包
Apr 09 Javascript
vue不操作dom实现图片轮播的示例代码
Dec 18 Javascript
vue打包npm run build时候界面报错的解决
Aug 13 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
使用bcompiler对PHP文件进行加密的代码
2010/08/29 PHP
php 删除一个数组中的某个值.兼容多维数组!
2012/02/18 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
js hover 定时器(实例代码)
2013/11/12 Javascript
jquery实现简单易懂的图片展示小例子
2013/11/21 Javascript
js实现用户注册协议倒计时的方法
2015/01/21 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
用js实现简单算法的实例代码
2016/09/24 Javascript
微信小程序 数据封装,参数传值等经验分享
2017/01/09 Javascript
JS实现的添加弹出层并完成锁屏操作示例
2017/04/07 Javascript
vue :src 文件路径错误问题的解决方法
2018/05/15 Javascript
原生js实现文件上传、下载、封装等实例方法
2020/01/05 Javascript
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
Python中的random()方法的使用介绍
2015/05/15 Python
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
简单谈谈Python中的json与pickle
2017/07/19 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
python 读取视频,处理后,实时计算帧数fps的方法
2018/07/10 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
对json字符串与python字符串的不同之处详解
2018/12/19 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
python3.7简单的爬虫实例详解
2019/07/08 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
2019/08/08 Python
Django结合ajax进行页面实时更新的例子
2019/08/12 Python
css3学习之2D转换功能详解
2016/12/23 HTML / CSS
家居饰品店创业计划书
2014/01/31 职场文书
上课不认真检讨书
2014/09/17 职场文书
工作年限证明模板
2014/11/01 职场文书
师德标兵事迹材料
2014/12/19 职场文书
班主任工作总结范文
2015/08/13 职场文书
小学英语教学随笔
2015/08/14 职场文书
python之django路由和视图案例教程
2021/07/26 Python