Chrome 使用 maxlength 属性计算 textarea 中的字符错误

IT技术 javascript html google-chrome textarea maxlength
2021-02-03 10:22:35

下面是一个例子:

$(function() {
  $('#test').change(function() {
    $('#length').html($('#test').val().length)
  })
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id=test maxlength=10></textarea>
length = <span id=length>0</span>

用行(一行一个字符)填充 textarea,直到浏览器允许。完成后,离开textarea,js代码也会计算字符。

所以就我而言,在 chrome 阻止我之前,我只能输入 7 个字符(包括空格)。虽然 maxlength 属性的值为 10:

图像

6个回答

以下是如何让您的 javascript 代码与浏览器认为在 textarea 中的字符数量相匹配:

http://jsfiddle.net/FjXgA/53/

$(function () {
    $('#test').keyup(function () {
        var x = $('#test').val();

        var newLines = x.match(/(\r\n|\n|\r)/g);
        var addition = 0;
        if (newLines != null) {
            addition = newLines.length;
        }

        $('#length').html(x.length + addition);
    })
})

基本上,您只需计算文本框中的总换行符,并将每个换行符的字符数加 1。

这在 Firefox 中是错误的,因为它将换行符计为 1 个字符
2021-03-26 10:22:35
也可以写成: $('#length').html(x.replace(/(\r\n|\n|\r)/g, '--').length);
2021-03-29 10:22:35
@Tim,即使脚本正确显示长度,如果已经存在回车符,它也允许输入更多字符。输入 2 个回车后,我能够输入 12 个字符。
2021-03-30 10:22:35
@Stalinko 我刚刚在 Firefox、Chrome、IE、Edge 和 Opera 中对此进行了测试。它似乎在所有这些中都起作用。换行符将长度加 2。这是你看到的还是你的意思?
2021-04-03 10:22:35

当涉及到 maxlength 时,您的回车每个被视为 2 个字符。

1\r\n
1\r\n
1\r\n
1

但似乎 javascript 只能使用其中一个\r\n(我不确定是哪一个),加起来只有7

是的,我也这么认为。但是为什么js不把回车算作2个字符呢?有没有办法让它这样做?
2021-03-13 10:22:35
当 textarea 的内容实际发布时,嵌入的换行符必须作为 CR LF 对传输。因此,正确的做法是让浏览器报告内容的长度,就好像换行符需要 2 个字符一样。
2021-03-13 10:22:35
我已经在 Chrome 和 Firefox 中记录了有关此问题的错误;它似乎已在 Chrome 的最新版本中修复。
2021-03-27 10:22:35
@Neal 哦,好吧,我正在对 OP 发表评论。这似乎是一个非常严重的问题,因为它使“maxlength”属性基本上无用。
2021-03-31 10:22:35
@Pointy 我在 Chrome ( 19.0.1084.1)的开发版本中,但我仍然有这个问题。
2021-04-03 10:22:35

根据上面 Pointy 的回答,似乎正确的方法是将所有新行都算作两个字符。这将使其跨浏览器标准化,并匹配发布时将发送的内容。

因此,我们可以遵循规范并使用回车符 - 换行符对替换所有出现的回车符后没有换行符,以及所有新行后没有回车符的情况。

var len = $('#test').val().replace(/\r(?!\n)|\n(?!\r)/g, "\r\n").length;

然后使用该变量来显示 textarea 值的长度,或限制它,等等。

由于未知的原因,jQuery 总是将 a 值中的所有换行符转换<textarea>为单个字符。也就是说,如果浏览器给它\r\n换行,jQuery 会确保它只是\n.val().

<textarea>出于“最大长度”的目的,Chrome 和 Firefox 都以相同的方式计算标签的长度

但是,HTTP 规范坚持将换行符表示为\r\n. 因此,jQuery、webkit 和 Firefox 都犯了这个错误。

结果是,<textarea>如果您的服务器端代码确实有一个字段值的固定最大大小,那么标签上的“maxlength”几乎毫无用处。

编辑——此时(2014 年末)看起来 Chrome (38) 的行为是正确的。然而,Firefox (33) 仍然不将每个硬返回计为 2 个字符。

@Pointy 这与这个问题相矛盾。OP 说他有一个 textarea,amaxlength为 10,但是当他在 textarea 中键入时,他只能键入 7 个字符(其中每个换行符包括 1 个字符)。这清楚地表明maxlength正在考虑每个新行的 2 个字符。我自己的测试证实了这一点......
2021-03-14 10:22:35
2021-03-15 10:22:35
似乎您说.val()返回错误(1 个字符),但浏览器正确地将其视为 2 个字符,因此maxlength每个换行符都会考虑 2 个字符。如果是这种情况,并且您的后端数据库具有固定的最大值,我看不出maxlength有什么用处,因为它正确计算了将保存在数据库中的字符数。
2021-03-15 10:22:35
Right-o - 我会在那里复制这个。
2021-03-18 10:22:35
@wired_in 再次嗨 :) 问题是内置maxlength检查没有考虑 CR 字符。这意味着内置maxlength将允许 textarea在客户端中包含比允许的更多的实际字符。因此,如果您有一个长度为 500 个字符的数据库字段,并且您说maxlength=500,则发布的表单可能包含超过 500 个字符的值 因此该属性是无用的。
2021-04-02 10:22:35

看起来javascript也在考虑换行符的长度。

尝试使用:


var x = $('#test').val();

x = x.replace(/(\r\n|\n|\r)/g,"");    

$('#length').html(x.length);

我在你的小提琴中使用了它并且它正在工作。希望这可以帮助。