Textarea highlight:当留下空行时偏移
Textarea highlight: offset when empty lines left
我有一个多值文本区域reading/writing from/to ng-model(array).
我有一个 div(荧光笔),它就像一个掩码,包含与 ng-model 相同的值,但突出显示 "NaN(value)" 上 return false 的值。
如果我在文本区域内按回车键,则会创建一个新行。在键入某些内容之前,此行不会成为值数组(ng-model)的一部分。如果未键入任何内容并创建了一个新的空行,则会在高亮遮罩和文本区域之间发生偏移。
建议???
如果不这样做,一切正常:
查看:
<script type="text/ng-template" id="form_field_float">
<div spellcheck="false">
<div class="highlighter" id="mirror">
<div ng-repeat=" x in dbo.attributes[attobj.name] track by $index" ng-controller="textVal">
<div ng-if="!check(x)"><span>{{ x }}</span></div>
<div ng-if="check(x)">{{ x }}</div>
</div>
</div>
<textarea id="textarea" rows="{{dbo.attributes[attobj.name].length + 2}}" ng-model="dbo.attributes[attobj.name]" ng-list=" " ng-trim="false"></textarea>
</div>
</script>
控制器:
app.controller('textVal', ['$scope',
function ($scope) {
$scope.check = function(valueToCheck){
if(!isNaN(valueToCheck)){
return true;
} else{ return false;}
}
}
]);
CSS:
.highlighter, #textarea {
width: 100%;
}
.highlighter {
position: absolute;
padding: 1px;
margin-left: 1px;
color: white;
}
.highlighter span {
color: red;
background: red;
opacity:.4;
}
#textarea {
position: relative;
background-color: transparent;
}
如果我现在将以下自定义指令添加到文本区域,我将禁止连续两次按回车键,但是如果在我创建新行的下方的行中突出显示无效值而不是偏移量 1 line/row 将出现在荧光笔 div 和文本区域值之间,因为我没有在荧光笔 div 中创建相同的空行。即使文本区域和荧光笔 div 都绑定到同一个 ng-model,ng-model 也不会将空行存储为值。一旦在新的空行中输入一个值,偏移量就会消失,但我希望荧光笔 div 在发生这种情况时能够适应:
app.directive('noTwolines', function () {
return {
restrict: 'A',
require: '?ngModel',
link: function (scope, element, attrs, ngModel) {
if (!ngModel) return;
ngModel.$parsers.unshift(function (inputValue) {
var digits = inputValue;
var textarea= document.getElementById("textarea");
var val = textarea.value;
var caretPos = val.slice(0, textarea.selectionStart).length;
console.log(inputValue.length);
console.log(val.slice(0, textarea.selectionStart).length);
if(caretPos === inputValue.length){
console.log('enter from end');
digits= inputValue.replace(/\n{2,}/gm, '\n');
}
if(caretPos < inputValue.length && inputValue.indexOf('\n\n') != -1){
digits= inputValue.replace(/\n{3,}/gm, '\n');
}
ngModel.$setViewValue(digits);
ngModel.$render();
return digits;
});
}
};
});
据我所知,您不希望高亮显示在空白处。如果这是正确的,那么只需在您的代码中添加以下行...
app.controller('textVal', ['$scope',
function ($scope) {
$scope.check = function(valueToCheck){
// new code just below...
if( !isNaN(valueToCheck) || (valueToCheck.trim() === '')){
// trim just assures no whitespace.
return true;
} else{ return false;}
}
}
]);
我有一个多值文本区域reading/writing from/to ng-model(array).
我有一个 div(荧光笔),它就像一个掩码,包含与 ng-model 相同的值,但突出显示 "NaN(value)" 上 return false 的值。
如果我在文本区域内按回车键,则会创建一个新行。在键入某些内容之前,此行不会成为值数组(ng-model)的一部分。如果未键入任何内容并创建了一个新的空行,则会在高亮遮罩和文本区域之间发生偏移。
建议???
如果不这样做,一切正常:
查看:
<script type="text/ng-template" id="form_field_float">
<div spellcheck="false">
<div class="highlighter" id="mirror">
<div ng-repeat=" x in dbo.attributes[attobj.name] track by $index" ng-controller="textVal">
<div ng-if="!check(x)"><span>{{ x }}</span></div>
<div ng-if="check(x)">{{ x }}</div>
</div>
</div>
<textarea id="textarea" rows="{{dbo.attributes[attobj.name].length + 2}}" ng-model="dbo.attributes[attobj.name]" ng-list=" " ng-trim="false"></textarea>
</div>
</script>
控制器:
app.controller('textVal', ['$scope',
function ($scope) {
$scope.check = function(valueToCheck){
if(!isNaN(valueToCheck)){
return true;
} else{ return false;}
}
}
]);
CSS:
.highlighter, #textarea {
width: 100%;
}
.highlighter {
position: absolute;
padding: 1px;
margin-left: 1px;
color: white;
}
.highlighter span {
color: red;
background: red;
opacity:.4;
}
#textarea {
position: relative;
background-color: transparent;
}
如果我现在将以下自定义指令添加到文本区域,我将禁止连续两次按回车键,但是如果在我创建新行的下方的行中突出显示无效值而不是偏移量 1 line/row 将出现在荧光笔 div 和文本区域值之间,因为我没有在荧光笔 div 中创建相同的空行。即使文本区域和荧光笔 div 都绑定到同一个 ng-model,ng-model 也不会将空行存储为值。一旦在新的空行中输入一个值,偏移量就会消失,但我希望荧光笔 div 在发生这种情况时能够适应:
app.directive('noTwolines', function () {
return {
restrict: 'A',
require: '?ngModel',
link: function (scope, element, attrs, ngModel) {
if (!ngModel) return;
ngModel.$parsers.unshift(function (inputValue) {
var digits = inputValue;
var textarea= document.getElementById("textarea");
var val = textarea.value;
var caretPos = val.slice(0, textarea.selectionStart).length;
console.log(inputValue.length);
console.log(val.slice(0, textarea.selectionStart).length);
if(caretPos === inputValue.length){
console.log('enter from end');
digits= inputValue.replace(/\n{2,}/gm, '\n');
}
if(caretPos < inputValue.length && inputValue.indexOf('\n\n') != -1){
digits= inputValue.replace(/\n{3,}/gm, '\n');
}
ngModel.$setViewValue(digits);
ngModel.$render();
return digits;
});
}
};
});
据我所知,您不希望高亮显示在空白处。如果这是正确的,那么只需在您的代码中添加以下行...
app.controller('textVal', ['$scope',
function ($scope) {
$scope.check = function(valueToCheck){
// new code just below...
if( !isNaN(valueToCheck) || (valueToCheck.trim() === '')){
// trim just assures no whitespace.
return true;
} else{ return false;}
}
}
]);