问题描述
这是一个例子:
$(function() {
$('#test').change(function() {
$('#length').html($('#test').val().length)
})
})
<script src="https://googleajax.admincdn.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id=test maxlength=10></textarea>
length = <span id=length>0</span>
用行 (一行一个字符) 填充文本区域,直到浏览器允许。当你完成,离开 textarea,并且 js 代码也会计算字符。
所以在我的情况下,我可以输入只有 7 个字符 (包括空格),在 Chrome 停止我之前。虽然 maxlength 属性的值为 10:
最佳解决思路
您的回车符在 maxlength 时被认为是 2 个字符。
1rn
1rn
1rn
1
但似乎 javascript 只能是 rn
之一 (我不知道哪一个) 只加起来 7 。
次佳解决思路
以下是如何获取 JavaScript 代码以匹配浏览器认为在文本区域中的字符数量:
$(function () {
$('#test').keyup(function () {
var x = $('#test').val();
var newLines = x.match(/(rn|n|r)/g);
var addition = 0;
if (newLines != null) {
addition = newLines.length;
}
$('#length').html(x.length + addition);
})
})
基本上,您只需计算文本框中的总换行符,并为每个字符计数添加 1 。
第三种解决思路
由于未知的原因,jQuery 始终将<textarea>
的所有换行符转换为单个字符。也就是说,如果浏览器为其添加了 rn
,则 jQuery 确保它只是.val()
的返回值中的 n
。
Chrome 和 Firefox 都以同样的方式计算<textarea>
标签的长度,用于”maxlength” 。
但是,HTTP 规范坚持认为换行符表示为 rn
。因此,jQuery,webkit 和 Firefox 都会出错。
结果是<textarea>
标签上的”maxlength” 如果您的 server-side 代码实际上具有固定的字段值的最大大小,则几乎没有用。
编辑 – 在这一点 (2014 年底),Chrome(38) 的行为看起来正确。但 Firefox(33) 仍然不会将每个硬拷贝计算为 2 个字符。
第四种思路
根据上面的 Pointy 的回答,似乎正确的方法是将所有新行计算为两个字符。这将标准化浏览器,并匹配发布时发送的内容。
所以我们可以遵循规范,并且替换所有出现的不在后面的新行的运输回车,以及所有没有运输回车的新行,使用回车换行对。
var len = $('#test').val().replace(/r(?!n)|n(?!r)/g, "rn").length;
然后使用该变量显示 textarea 值的长度,或限制它,等等。
第五种思路
看起来 JavaScript 正在考虑新的行字符的长度。
尝试使用:
var x = $('#test').val();
x = x.replace(/(rn|n|r)/g,"");
$('#length').html(x.length);
我用它在你的小提琴,它是工作。希望这可以帮助。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。