我有一个场景,我有两个或更多的textarea,当用户在textarea中输入值,当值达到max-length,例如ng-max-length为15时,焦点应自动移动到下一个文本 - 面积。
如何实现这一目标?
为了控制最大长度,我已经从link获得了解决方案。
但我不知道如何自动关注下一个元素
下面我给出了我试过的代码
textarea.html
<!DOCTYPE html>
<html>
<head>
<title>Angular App</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
</head>
<body>
<div ng-app="taApp">
<div ng-controller="taController">
<textarea my-maxlength="15" ng-model="ta1.text1" rows="4" cols="20"> </textarea>
<textarea my-maxlength="15" ng-model="ta2.text2" rows="4" cols="20"> </textarea>
<textarea my-maxlength="15" ng-model="ta3.text3" rows="4" cols="20"> </textarea>
</div>
</div>
<script src="js/libs/angularjs-1.0.2/angular.js" type="text/javascript"></script>
<script src="js/controller/pageController.js" type="text/javascript"></script>
<script src="js/controller/textAreaFocus.js" type="text/javascript"></script>
</body>
</html>
textAreaFocus.js
angular.module('textareafocus',[]).directive('myMaxlength', function() {
return {
require: 'ngModel',
link: function (scope, element, attrs, ngModelCtrl) {
var maxlength = Number(attrs.myMaxlength);
function fromUser(text) {
if (text.length > maxlength) {
var transformedInput = text.substring(0, maxlength);
ngModelCtrl.$setViewValue(transformedInput);
ngModelCtrl.$render();
return transformedInput;
}
return text;
}
ngModelCtrl.$parsers.push(fromUser);
}
};
});
pageController.js
var taApp = angular.module('taApp',["textareafocus"]); // this creates a new angular module named "myApp";
taApp.controller('taController', function ($scope,$http) {
$scope.ta1 = { text1: 'TextArea 1'};
$scope.ta2 = { text2: 'TextArea 2'};
$scope.ta3 = { text3: 'TextArea 3'};
});
截图
目前我只有3个textarea但可能更多,因此焦点应该自动转移到下一个元素。
我尝试使用元素[1] .focus(),但它不起作用。
请帮助我解决此问题。
答案 0 :(得分:11)
您可以实现一个自定义指令,要求jQuery查找其他文本区域,使用ngMaxlength确定最大长度(可以更改为自定义属性),使用tabindex确定Tab键顺序:
<强>指令强>
app.directive('autoNext', function() {
return {
restrict: 'A',
link: function(scope, element, attr, form) {
var tabindex = parseInt(attr.tabindex);
var maxLength = parseInt(attr.ngMaxlength);
element.on('keypress', function(e) {
if (element.val().length > maxLength-1) {
var next = angular.element(document.body).find('[tabindex=' + (tabindex+1) + ']');
if (next.length > 0) {
next.focus();
return next.triggerHandler('keypress', { which: e.which});
}
else {
return false;
}
}
return true;
});
}
}
});
<强> HTML 强>
<textarea ng-maxlength="10" tabindex="1" auto-next></textarea>
<textarea ng-maxlength="10" tabindex="2" auto-next></textarea>
<textarea ng-maxlength="10" tabindex="3" auto-next></textarea>
答案 1 :(得分:1)
你不能在textarea.html
中使用jQuery吗?如果可以,那么这是一个解决方案:
$("textarea").keyup(function(event) {
if ($(this).val().length == $(this).attr("maxlength")) {
textfields = $("textarea");
curr = textfields.index(this);
next = textfields[curr + 1];
if (next != null) {
next.focus();
}
}
});
JSFiddle Link:http://jsfiddle.net/a2gtnmrm/