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

Rom*_*nov 42 html javascript textarea google-chrome maxlength

这是一个例子:

$(function() {
  $('#test').change(function() {
    $('#length').html($('#test').val().length)
  })
})
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

用线条填充textarea(一行一个字符),直到浏览器允许.完成后,保留textarea,js代码也将计算字符.

所以在我的情况下,我可以在chrome阻止我之前只输入7个字符(包括空格).虽然maxlength属性的值是10:

imgur

Tim*_*Tim 37

以下是如何使您的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);
    })
})
Run Code Online (Sandbox Code Playgroud)

基本上,您只需计算文本框中的总换行符数,并为每个换行符添加1.

  • 也可以写成:`$('#length').html(x.replace(/(\ r \n | \n |\r)/ g,' - ').length);` (7认同)
  • 这在Firefox中有效,因为它将换行计为1个字符 (3认同)

Nea*_*eal 28

当涉及maxlength时,您的回车被认为是2个字符.

1\r\n
1\r\n
1\r\n
1
Run Code Online (Sandbox Code Playgroud)

但似乎javascript只有一个\r\n(我不确定哪一个)只能加起来7.

  • 当textarea的内容实际上**张贴**时,嵌入的换行符**必须作为CR LF对传输.因此,正确的做法是浏览器报告内容的长度,就像换行符需要2个字符一样. (11认同)
  • @Neal 哦,好吧,我正在对 OP 发表评论。这似乎是一个非常严重的问题,因为它使得“maxlength”属性基本上毫无用处。 (2认同)

Poi*_*nty 14

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

<textarea>对于"maxlength",Chrome和Firefox都以相同的方式计算标签的长度.

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

结果是,<textarea>如果您的服务器端代码确实具有固定的字段值最大大小,则标签上的"maxlength" 几乎没用.

编辑 - 此时(2014年末)看起来Chrome(38)表现正常.然而,Firefox(33)仍然不会将每个硬回车计为2个字符.

  • @wired_in又来了:)问题是内置的`maxlength`检查确实**不考虑CR字符.这意味着内置的`maxlength`将允许textarea在客户端中包含比允许的更多*实际*字符.因此,如果您有一个长度为500个字符的数据库字段,并且您说"maxlength = 500",则发布的表单可能包含*超过500个字符的值.*该属性因此无用. (2认同)

mat*_*att 13

基于Pointy的上述答案,似乎正确的方法是将所有新行计为两个字符.这样可以跨浏览器对其进行标准化,并匹配发布时发送的内容.

因此,我们可以按照规范更换所有出现的回车符,而不是新行,并且所有新行都没有后面有回车符,带有回车 - 换行符对.

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

然后使用该变量显示textarea值的长度,或限制它,依此类推.


归档时间:

查看次数:

42130 次

最近记录:

8 年,1 月 前