javascript - 如何限制每行 textarea 的字节数?
问题描述
此页面必须支持韩语,每个字符占用 2 个字节。我可以获得每行字节(lineByte),但我不知道我能做更多。我想导致换行或阻止输入。
function limitLines(obj, e) {
let numberOfLines = (obj.value.match(/\n/g) || []).length + 1;
let maxRow = obj.rows;
if (e.which === 13 && numberOfLines === maxRow) {
return false;
}
}
$('textarea').on('keyup', function() {
var maxLength = $(this).attr('data-leng');
var text = $(this).val();
var lines = text.split(/(\r\n|\n|\r)/gm);
for (var i = 0; i < lines.length; i++) {
var lineByte = 0;
for (var j = 0; j < lines[i].length; j++) {
var currentByte = lines[i].charCodeAt(j);
if (currentByte > 128) {
lineByte += 2;
} else {
lineByte++;
}
}
console.log(lineByte);
if (lineByte > maxLength) {
console.log('How Can I Do?')
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea wrap="hard" name="" class="jua" onkeydown="return limitLines(this, event)" id="text_01_01" rows="2" cols="9" placeholder="Write Text In This Area." data-leng="18"></textarea>
解决方案
如果我猜对了,您希望将每行的最大字节数限制为小于data-leng
. 为此,您只需要剪切每行中的所有溢出字符。这是一个例子:
$('textarea').on('keyup', function() {
var maxLength = $(this).attr('data-leng');
var text = $(this).val();
var lines = text.split("\n");
for (var i = 0; i < lines.length; i++) {
var lineByte = 0;
for (var j = 0; j < lines[i].length; j++) {
var currentByte = lines[i].charCodeAt(j);
if (currentByte > 128) {
lineByte += 2;
} else {
lineByte++;
}
//if line-bytes are greater than max-length remove chars at line-end
if (lineByte > maxLength) {
lines[i] = lines[i].substr(0, j);
break;
}
}
//join lines and replace value in textarea
$(this).val (lines.join("\n"));
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea wrap="hard" name="" class="jua" id="text_01_01" rows="2" cols="9" placeholder="Write Text In This Area." data-leng="18"></textarea>
推荐阅读
- android - 工具栏中的 ConstraintLayout 未将 match_parent 应用于宽度或高度
- mysql - Symfony4 - 计数查询的学说分页性能低下(634484 条记录)
- java - 当客户端和服务器负载平衡时,通过 TCP 套接字连接进行数据流传输是否安全?
- reactjs - 通过单击按钮更新元素
- php - SQL中的IF查询 PHP中的DELETE
- mysql - MySQL JOIN 2 依赖于第一个子查询的子查询
- list - 如何在 SwiftUI 的列表中启用选择
- sonarqube - 当我使用 sonar.web.context 时,Sonarqube 7.7 没有启动
- python - zlib库中窗口大小对数的含义是什么?
- mysql - Kafka 生产者创建 Debezium MySQL 连接器后无法创建主题并引发连续错误