【问题标题】:Saved password in Firefox send empty fieldsFirefox 中保存的密码发送空字段
【发布时间】:2014-04-23 20:13:11
【问题描述】:

我在保存浏览器凭据时遇到问题。我第一次使用我的应用程序登录时,浏览器要求我保存字段,我按确定,但是当我第二次登录并且浏览器使用保存的凭据填写表单字段时,我按登录,浏览器发送没有参数的请求。

HTML

<div ng-controller="modalCtrl">
    <script type="text/ng-template" id="login">
    <form ng-submit="login()" class="login">
        <input type="text" ng-model="data.username" placeholder="username" value="username" class="form-control" popover="inserisci qui il tuo username" popover-trigger="focus" popover-placement="right"/><br>
        <input id="pwd" type="password" ng-model="data.password" placeholder="password" value="password" class="form-control" popover="inserisci qua la tua password" popover-trigger="focus" popover-placement="right"/><br>
        <input class="btn-primary btn-lg" type="submit" value="Login">
        </form>
    </script>
</div>

JS

modalController.controller('modalCtrl',function ($scope, $modal) {
var open = function () {
    var modalInstance = $modal.open({
        templateUrl: 'login',
        controller:this.loginCtrl,
        backdrop:'static'
        });
};
open();

});
var loginCtrl = function ($scope, $http, $modalInstance, $state) {  
    $scope.data = {username: this.username, password: this.password};
    var data = $scope.data;
    $scope.login = function () {
    $http.post(server[0] + '/bbi-api/sauth/1', {name: data.username, password: data.password})
        .then(function () {
            $state.go('home');
            $modalInstance.close();

        },
        function (response) {
            alert(response.status);
        });
    };
};

奇怪的是,如果我重写凭据一切正常,但如果我只是用浏览器输入的凭据按下按钮,应用程序会发送一个带有空白参数的帖子。

【问题讨论】:

    标签: javascript angularjs http firefox angular-ui


    【解决方案1】:

    问题是浏览器的自动填充没有触发正确的事件,因此 Angular 可以绑定到它。

    一种解决方案是为您的输入触发更改事件,这是我从此处自定义的指令 (http://victorblog.com/2014/01/12/fixing-autocomplete-autofill-on-angularjs-form-submit/):

    咖啡脚本:

    angular.module('app')
      .directive 'formAutoFillFix', ->
        (scope, elem, attrs) ->
          # Fixes Chrome bug: https://groups.google.com/forum/#!topic/angular/6NlucSskQjY
          elem.prop 'method', 'POST'
    
          # Fix autofill issues where Angular doesn't know about autofilled inputs
          if attrs.ngSubmit
            setTimeout ->
              elem.unbind('submit').bind 'submit', (e) ->
                e.preventDefault()
    
                elem.find('input').triggerHandler('change')
    
                scope.$apply attrs.ngSubmit
            , 0
    

    Javascript:

    angular.module('app').directive('formAutoFillFix', function() {
      return function(scope, elem, attrs) {
        // Fixes Chrome bug: https://groups.google.com/forum/#!topic/angular/6NlucSskQjY
        elem.prop('method', 'POST');
    
        // Fix autofill issues where Angular doesn't know about autofilled inputs
        if(attrs.ngSubmit) {
          setTimeout(function() {
            elem.unbind('submit').bind('submit', function(e) {
              e.preventDefault();
              elem.find('input').triggerHandler('change');
              scope.$apply(attrs.ngSubmit);
            });
          }, 0);
        }
      };
    });
    

    该网站上发布的解决方案使用 jQuery,而上述解决方案不依赖它。

    像使用其他指令一样使用它:

    <form role="form" ng-submit="login()" form-auto-fill-fix>
    

    【讨论】:

    • 感谢 StuR,我之前无法尝试您的解决方案,现在我的问题已解决,但您必须在 html 部分编辑您的答案,它是“form-autofill-fix”而不是“form-自动填充修复”,第二种方式解决方案不起作用。还是谢谢。
    • 不好意思问了很久!我有同样的问题,我尝试了你的解决方案,但我不知道如何使它工作。我只是将form-auto-fill-fix="" 视为我表单的属性。
    【解决方案2】:

    效果很好

        myApp.directive('formauto', function() {
      return function(scope, elem, attrs) {
        // Fixes Chrome bug: https://groups.google.com/forum/#!topic/angular/6NlucSskQjY
        elem.prop('method', 'POST');
    
        // Fix autofill issues where Angular doesn't know about autofilled inputs
        if(attrs.ngSubmit) {
          setTimeout(function() {
            elem.unbind('submit').submit(function(e) {
              e.preventDefault();
              elem.find('input, textarea, select').trigger('input').trigger('change').trigger('keydown');
              scope.$apply(attrs.ngSubmit);
            });
          }, 0);
        }
      };
    });
    

    然后

    <form role="form" ng-submit="login()" formauto>
    

    【讨论】:

      猜你喜欢
      • 2016-04-13
      • 1970-01-01
      • 2019-02-06
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      相关资源
      最近更新 更多