检查输入是否具有焦点

7
我有一个需要输入至少一定数量字符的输入框。当用户开始输入但未达到所需的最小字符数并转移到另一个字段时,我希望更改文本的类以将其变为红色。
我尝试使用此代码检测焦点变化,但它没有生效:
$scope.$watch(function(){
    return $('#job_desc').is(':active');
}, function(){
    console.log('test');
})

问题是什么?

非常感谢


你在 Angular 项目中是否额外添加了 jQuery,还是依赖于 Angular 的 jQuery-lite(默认情况下)? - Simon Wicki
我也有jQuery。 - Spearfisher
为什么不在必填表单元素上绑定失焦事件呢?$('.blurrable').bind('blur', function(evt) { ... }); 如果需要重新计算,你可以在失焦事件回调中使用 scope.$apply()。 - Simon Wicki
2
手表并不是一个真正的事件处理器,直到下一个脏检查周期才会被评估。使用ngBlur和ngFocus来检测焦点变化。更好的方法是研究Angular验证,它专门用于这种情况。 - Anthony Chu
2个回答

11
如果您正在使用AngularJS 1.2,则有两个指令可帮助您监视字段是否具有焦点:ng-focus和ng-blur。如果没有,实现自己的指令非常简单。以下是代码(plunker):(plunker):
<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
       <script data-require="jquery" data-semver="2.0.3" src="http://code.jquery.com/jquery-2.0.3.min.js"></script>

    <script data-require="angular.js@1.2.x" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js" data-semver="1.2.16"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <p>Hello {{name}}!</p>
    <form>
       <input ng-model="name" id="name" ng-focus="focused()" ng-blur="blurred()">
       <input ng-model="name2">
    </form>
  </body>

</html>

和 JavaScript

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
  $scope.name = 'World';
  $scope.focused = function() {
    console.log("got focus");
  }

   $scope.blurred = function() {
    console.log("lost focus");
  }
});

如果你只是想进行验证,那么可以查看 AngularJS 中的表单验证,例如 myForm.myInput.$valid。AngularJS 会相应地设置 ng-valid 和 ng-invalid 类。


2
您也可以通过特定的选择器进行监听,如下所示。
function listenForFocus() {
    var el = angular.element( document.querySelectorAll( 'input, select' ) );
    for (var i = 0; i < el.length; i++) {
        var element = angular.element(el[i]);
        element.bind('blur', function (e) {
            console.log('blur');
        });
        element.bind('focus', function (e) {
            console.log('focus');
        });
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接