angularjs将焦点移动到下一个控制输入

时间:2013-08-06 17:39:15

标签: angularjs

什么是最好的方式,当在表单内输入时,焦点转到下一个输入而不是使用angularjs提交表单。

我有一个包含很多字段的表单,客户习惯按Enter键移动到下一个输入(从桌面应用程序转发)。当用户点击进入时,angularjs会保存表单。我想改变这个。有可能吗?

10 个答案:

答案 0 :(得分:12)

我建议制作一个自定义指令。像这样的东西。我没有测试过这个。

.directive('focus', function() {
  return {
    restrict: 'A',
    link: function($scope,elem,attrs) {

      elem.bind('keydown', function(e) {
        var code = e.keyCode || e.which;
        if (code === 13) {
          e.preventDefault();
          elem.next().focus();
        }
      });
    }
  }
});

这样的事情应该有用。你可能需要调整一些东西。祝你好运。

答案 1 :(得分:9)

创建自定义指令:

.directive('nextOnEnter', function () {
    return {
        restrict: 'A',
        link: function ($scope, selem, attrs) {
            selem.bind('keydown', function (e) {
                var code = e.keyCode || e.which;
                if (code === 13) {
                    e.preventDefault();
                    var pageElems = document.querySelectorAll('input, select, textarea'),
                        elem = e.srcElement || e.target,
                        focusNext = false,
                        len = pageElems.length;
                    for (var i = 0; i < len; i++) {
                        var pe = pageElems[i];
                        if (focusNext) {
                            if (pe.style.display !== 'none') {
                                angular.element(pe).focus();
                                break;
                            }
                        } else if (pe === elem) {
                            focusNext = true;
                        }
                    }
                }
            });
        }
    }
})

答案 2 :(得分:4)

这是我最终的指示(感谢Zack Argyle):


    
    angular.module('myApp').directive("nextFocus", nextFocus);

    /** Usage:
      <input next-focus id="field1">
      <input next-focus id="field2">
      <input id="field3">
      Upon pressing ENTER key the directive will switch focus to
      the next field id e.g field2
      The last field should not have next-focus directive to avoid
      focusing on non-existing element.
      Works for Web, iOS (Go button) & Android (Next button) browsers, 
    **/

    function nextFocus() {
      var directive = {
        restrict: 'A',
        link: function(scope, elem, attrs) {
          elem.bind('keydown', function(e) {
            var partsId = attrs.id.match(/field(\d{1})/);
            var currentId = parseInt(partsId[1]);

            var code = e.keyCode || e.which;
            if (code === 13) {
              e.preventDefault();
              document.querySelector('#field' + (currentId + 1)).focus();
            }
          });
        }
      };
      return directive;

    }

答案 3 :(得分:3)

我尝试了这个解决方案。正如所宣传的,它需要一些调整。以下是最终为我工作的内容:

.directive("focus", function () {
        return {
            restrict: "A",
            link: function ($scope, elem, attrs) {
                var focusables = $(":focusable");
                elem.bind("keydown", function (e) {
                    var code = e.keyCode || e.which;
                    if (code === 13) {
                        var current = focusables.index(this);
                        var next = focusables.eq(current + 1).length ? focusables.eq(current + 1) : focusables.eq(0);
                        next.focus();
                        e.preventDefault();
                    }
                });
            }
        }

请注意,为了使:focusable伪工作,您需要引用JQueryUI。 (最新版本1.11.4适用于我)

答案 4 :(得分:1)

这是我最终的指令(感谢Zack Argyle和Oleg):

app.directive(&#34; nextFocus&#34;,function(){

    /** Usage:
      <input next-focus tabindex="0" id="field1">
      <input next-focus tabindex="1" id="field2">
      <input id="field3">
      Upon pressing ENTER key the directive will switch focus to
      the next field id e.g field2
      The last field should not have next-focus directive to avoid
      focusing on non-existing element.
      Works for Web, iOS (Go button) & Android (Next button) browsers, 
    **/
    var directive = {
        restrict: 'A',
        link: function (scope, elem, attrs) {
            elem.bind('keydown', function (e) {
                var code = e.keyCode || e.which;
                if (code === 13) {
                    try {
                        if (attrs.tabindex != undefined) {
                            var currentTabIndex = attrs.tabindex;
                            var nextTabIndex = parseInt(attrs.tabindex) + 1;
                            $("[tabindex=" + nextTabIndex + "]").focus();
                        }
                    } catch (e) {

                    }
                }
            });
        }
    };
    return directive;

});

答案 5 :(得分:1)

基于wolcy97的回答,但只使用了角度

 /** Usage:
  <input next-focus tabindex="0">
  <input next-focus tabindex="1">
  <input tabindex="2">
  Upon pressing ENTER key the directive will switch focus to
  the next tabindex.
  The last field should not have next-focus directive to avoid
  focusing on non-existing element.
  Works for Web, iOS (Go button) & Android (Next button) browsers, 
**/ 
 app.directive('nextFocus', [function() {
  return {
    restrict: 'A',
    link: function(scope, elem, attrs) {
      elem.bind('keydown', function(e) {
        var code = e.keyCode || e.which;
        if (code === 13) {
          e.preventDefault();
          try {
            if (attrs.tabindex !== undefined) {
              var currentTabeIndex = attrs.tabindex;
              var nextTabIndex = parseInt(currentTabeIndex) + 1;
              var elems = document.querySelectorAll("[tabindex]");
              for (var i = 0, len = elems.length; i < len; i++) {
                var el = angular.element(elems[i]);
                var idx = parseInt(el.attr('tabindex'));
                if (idx === nextTabIndex) {
                  elems[i].focus();
                  break;
                }
              }
            }
          } catch (e) {
            console.log('Focus error: ' + e);
          }
        }
      });
    }
  };
}]);

答案 6 :(得分:0)

纯JavaScript输入为TAB

<img id=\"portrait\" class=\"portrait\" src=\"{$files[$pos]}\" width=\"88\" height=\"88\" border=\"1\" />

答案 7 :(得分:0)

  <table class="table table-striped table-bordered table-hover">
                                        <tr>
                                            <th>S No</th>
                                            <th>Stock Id</th>
                                            <th>Description</th>
                                            <th>Qty</th>
                                            <th>UOM</th>
                                            <th>Rate</th>
                                            <th>Amount</th>

                                            <th>Add</th>
                                            <th>Delete</th>
                                        </tr>
                                        <tr ng-repeat="item in stockitems">
                                            <td>{{$index + 1}}</td>
                                            <td>

                                                <input type="text" style="width:70px" id="stkid{{$index}}" class="form-control" name="stockid" required insert="Addnewrow();" ng-keyup="moveFocus('desc','amount','stkid','stkid',$index,$event)" ng-blur="getStockitem($index);" typeahead="a.stockitem_code as (a.stockitem_code +' | ' + a.stockitem_name +' | '+ a.rate) for a in stock | filter:$viewValue | limitTo:8" data-ng-model="item.stockid" rows="3" />
                                            </td>
                                            <td>

                                                <input type="text" class="form-control" id="desc{{$index}}" name="description" ng-keyup="moveFocus('quantity','stkid','desc','desc',$index,$event)" data-ng-model="item.description" rows="3" />
                                            </td>
                                            <td>

                                                <input type="text" style="width:70px" id="quantity{{$index}}" class="form-control" ng-keyup="moveFocus('uom','desc','quantity','quantity',$index,$event)" ng-change="GetAmount($index,'qty');" ng-pattern="/^\d+$/" required name="qty" data-ng-model="item.qty" rows="3" />
                                            </td>
                                            <td>

                                                <input type="text" style="width:70px" id="uom{{$index}}" class="form-control" name="uom" ng-keyup="moveFocus('rate','quantity','uom','uom',$index,$event)" data-ng-model="item.uom" required rows="3" />
                                            </td>
                                            <td>


                                                <input type="text" style="width:70px" id="rate{{$index}}" class="form-control" name="rate" ng-keyup="moveFocus('amount','uom','rate','rate',$index,$event)" required data-ng-model="item.rate" ng-pattern="/^\d{0,9}(\.\d{1,9})?$/" ng-change="GetAmount($index,'rate');" rows="3" />
                                            </td>
                                            <td>

                                                <input type="text" style="width:70px" id="amount{{$index}}" class="form-control" ng-keyup="moveFocus('stkid','rate','amount','amount',$index,$event)" name="amount" required data-ng-model="item.amount" rows="3" />
                                            </td>

                                            <td><span ng-click="AddEstimation($index);"><a>Add</a></span></td>
                                            <td><span ng-click="DeleterowEstimation($index);"><a>Delete</a></span></td>
                                        </tr>
                                    </table>

答案 8 :(得分:0)

  $scope.moveFocus = function (nextId,prevId,downId,upId,index,event) {
            debugger;
            if (event.keyCode == 39) {
                nextId = nextId + index;
                $('#' + nextId).focus();
            }
            else if(event.keyCode == 37)
            {
                prevId = prevId + index;
                $('#' + prevId).focus();
            }
            else if(event.keyCode == 38)
            {
                upId = upId + (index - 1);
                $('#' + upId).focus();
            }
            else if(event.keyCode == 40)
            {
                downId = downId + (index + 1);
                $('#' + downId).focus();
            }
            else if(event.keyCode==13)
            {
                if (nextId == "desc") {
                    nextId = "quantity" + index;
                    $('#' + nextId).focus();
                }
                else if(nextId == "uom")
                {
                    nextId = "stkid" + (index + 1);
                    $('#' + nextId).focus();
                }
            }
        };

答案 9 :(得分:-1)

按Enter键按此按钮移动到DOM的下一个元素,但元素需要id才能设置焦点

starter.directive('focustonext', function () {
return {
    restrict: 'A',
    link: function ($scope, selem, attrs) {
        selem.bind('keydown', function (e) {
            var code = e.keyCode || e.which;
            if (code === 13) {
                e.preventDefault();
                var pageElems = document.querySelectorAll('input, select, textarea'),
                    elem = e.srcElement || e.target,
                    focusNext = false,
                    len = pageElems.length;
                for (var i = 0; i < len; i++) {
                    var pe = pageElems[i];
                    if (focusNext) {
                        if (pe.style.display !== 'none') {                               
                            document.getElementById(pe.id).focus();
                            break;
                        }
                    } else if (pe === elem) {
                        focusNext = true;
                    }
                }
            }
        });
    }
   }
});

谢谢大家......