[英]Set Caret position in Input with AngularJS
我需要更改輸入的插入位置,其中添加了給定的位數( 示例 )。
app.controller('MainCtrl', function($scope, $element, $timeout, $filter) {
//$scope.val = '12';
$scope.$watch('val', function(newValue, oldValue) {
if (!isNaN(newValue)) {
if (newValue.length > 3) {
//Set Caret Position
}
}
});
});
有可能做這樣的例子嗎?
我需要例如:
輸入:1234。
所以插入符號位置為2。
新數字:9
決賽:12934
提前致謝。
我認為這樣的事情在指令中看起來更好。 例如:
app.directive('caret', function() {
function setCaretPosition(elem, caretPos) {
if (elem !== null) {
if (elem.createTextRange) {
var range = elem.createTextRange();
range.move('character', caretPos);
range.select();
} else {
if (elem.setSelectionRange) {
elem.focus();
elem.setSelectionRange(caretPos, caretPos);
} else
elem.focus();
}
}
}
return {
scope: {value: '=ngModel'},
link: function(scope, element, attrs) {
var caret = Number(attrs.caret);
scope.$watch('value', function(newValue, oldValue) {
if (newValue && newValue != oldValue && !isNaN(newValue) && newValue.length > (caret + 1)) {
setCaretPosition(element[0], caret);
}
});
}
};
});
用法:
<input ng-model='val' caret="2" />
我使用setCaretPosition
函數從這個答案中進行跨瀏覽器光標定位。
我認為最好的方法是在我們處理DOM操作時制作可重用的指令。
鏈接到演示: http : //plnkr.co/edit/qlGi64VO1AOrNpxoKA68?p = preview
var app = angular.module('angularjs-starter', []);
app.controller('MainCtrl', function($scope, $element, $timeout, $filter) {
$scope.$watch('val', function(newValue, oldValue) {
if (!isNaN(newValue)) {
if (newValue.length > 3) {
// $element.find('input')[0].selectionEnd = 2;
}
}
});
});
app.directive('setCaret', function() {
return {
restrict: 'A',
link: function(scope,element,attrs) {
var changed = false;
element.bind('keypress', function() {
if(element[0].selectionStart > 3 && !changed) {
changed = true;
element[0].selectionEnd = parseInt(attrs.position, 10);
}
})
},
}
})
你可以在控制器的注釋部分看到我們可以通過使用$ element來訪問它,但由於這是DOM而控制器不是用於DOM操作,我們需要將它變成一個指令。
我也有同樣的問題。
我想解決它創建一個適當的指令。 你可以在這里找到它。 好好享受!
Include指令,由caret-aware
屬性聲明
<script src="https://cdn.rawgit.com/leodido/ng-caret-aware/master/caretaware.min.js"></script>
<script type="text/javascript">
var app = angular.module('myModule', ['leodido.caretAware']);
</script>
...
<div data-ng-app="app">
<input type="text" name="myname" caret-aware="cursor"/>
</div>
然后在范圍上,您將擁有一個變量cursor
其中包含名為myname
的輸入中插入符號的位置。
然而,該指令的控制器公開了一個API
getPosition
setPosition
有關其他用法示例,請參閱上面鏈接的github存儲庫的example
目錄。
我相信你可以通過在輸入上使用.setSelectionRange()
來實現。 我更新了您的示例 - 看看這是否是您想要的: http : //plnkr.co/edit/bIJAPPAzkzqLIDUxVlIy?p = preview
注意:IE8不支持setSelectionRange
(參見https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement.setSelectionRange ),因此如果你需要支持IE <9,你需要尋找墊片。
我提出了一個有效的解決方案。 所以基本上,你必須創建一個指令:
app.directive('keypressdetector', function($compile){
return {
restrict:'AEC',
link: function(scope, element, attrs){
element.bind("keypress", function (event) {
if(event.which === 13) {
var selectionStart = element[0].selectionStart;
var value = element.val();
var valueLength = value.length;
var newValue= '';
if (selectionStart == valueLength){
newValue = value;
} else {
newValue = value.substring(selectionStart, valueLength);
}
var newElement = angular.element('<input type="text" value="' + newValue +'"/>')
angular.element(document.body).append(newElement);
}
});
}
};
});
在那種情況下,你的控制器將毫無用處。 您可以像這樣調用指令(請參閱:keypressdetector):
<div ng-app="myapp">
<div ng-controller="LoginController">
<div>Hello {{ user.firstName }}</div>
<input ng-model="user.firstName" keypressdetector />
<input type="submit" ng-click="login()" value="Login"/>
<div ng-repeat="login in logins">{{ login }}</div>
</div>
</div>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.