带有换行符的文本区域maxlength的特征检测
Feature detection for text area maxlength with newlines
有充分的文档证明,不同的浏览器对文本区域中的换行符的处理与maxlength有关。例如,如果使用换行符,下面的代码片段在Chrome和Firefox中的表现会有所不同。
我的问题是,我需要允许用户输入换行符,我需要向他们显示他们还剩下多少字符。我可以检测他们的浏览器类型,但这很脆弱,是一种已知的反模式。是否有一种方法可以使用特征检测来正确地做到这一点?还是应该避免maxlength?请注意,我的问题不是特定于jQuery的,我只是在示例中使用了jQuery,以便简单地显示正在发生的事情。请注意,我已经有一个没有maxlength的解决方案的例子(见下面),但它不能很好地在ember等框架中转换,因为你想避免使用jquery hack。
Maxlength问题(尝试使用Firefox, Chrome,并键入至少一个换行符。
$('.t').on('input',function(){
$('.x').html($('.t').val().length);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea class="t" rows=3 maxlength=10></textarea>
<br>
chars typed: <span class="x"></span>
没有maxlength工作区(gross)
$('.t').on('input', function(){
let maxLength = 10;
let val = $('.t').val();
$('.t').val((val && val.length) ? val.substring(0,maxLength) : val);
$('.x').html($('.t').val().length);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea class="t" rows=3></textarea>
Chars typed: <span class='x'></span>
您可以使用keydown
和keyup
事件和正则表达式,它们将用空字符串替换所有新的行字符。在keydown
事件中,当到达maxLength
时禁止输入新字符,在keyup
事件中显示剩余字符数:
var maxLength = 10;
var navKeys = [8,46,27,38,40,33,34,13,37,39];
$(".x").html(maxLength);
$("textarea")
.on("keydown", function(e){
// Get value without new lines
var val = $(this).val().replace(/'n|'r/g, "");
// Allow nav keys
if(navKeys.indexOf(e.keyCode) !== -1) {
return true;
}
// Do not allow type in another char
if(val.length >= maxLength) {
e.preventDefault();
return;
}
})
.on("keyup", function(e) {
// Get value without new lines
var val = $(this).val().replace(/'n|'r/g, "");
$(".x").html(maxLength - val.length);
// Check the max length
if(val.length > maxLength) {
$(this).val(val.substr(0,maxLength));
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea></textarea>
<br/>
chars typed: <span class="x"></span>
这对我在FF和Chrome中也是有效的。
我认为最好的选择是你实现自己的maxLength。像这样:
var element = document.getElementById('textarea'),
maxLength = 10;
var trim = function() {
if(element.value.length >= maxLength) {
element.value = element.value.substring(0, maxLength);
}
};
// for older IE
element.onkeydown = function() {
setTimeout(trim, 1);
};
// browser support: CH, IE 9+, FF 4.0, SF 5.0, OP
element.oninput = trim;
<textarea rows="3" id="textarea"></textarea>
相关文章:
- 如何检测是否有溢出
- 如何检测用于WebGL的专用或集成显卡
- 防止Alt+Shift默认操作或检测多种操作系统语言的Javascript
- 如何在使用selectBoxIt JQuery插件时检测选项更改
- 如何使用密码检测网络中的状态连接
- 使用JavaScript检测Flash
- 使用特征检测通过点表示法检查对保留字的支持
- 什么's特征检测、特征推断和使用UA字符串之间的区别
- 视差/背景位置的特征检测
- 如何特征检测XMLHttpRequest是否支持responseType=“”;阵列缓冲器”;
- Javascript -检测标签并检查maxlength
- HTML5拖放的setDragImage特征检测
- 特征检测是否需要用户手势
- 在粘贴maxlength-set输入时检测字符串长度
- 特征检测-狮子滚动条
- SVG中矢量效果属性的特征检测
- 特征检测与Modernizr不工作
- 带有换行符的文本区域maxlength的特征检测
- CSS3过渡属性的特征检测
- 如何为Web推送做特征检测