textarea输入框在移动端换行符不计算长度问题,即时检测输入框的字数

应用场景:微信端textarea标签的使用,下图:第二张图片在换行后长度为149,元素属性maxlength="150",但是却输入不了了,

代码:

       $('.textarea_box textarea').on("keyup",function(e){
                $(this).autosize();
                $('.textarea_box span').text( $(this).val().length +'/150' );
            });

问题分析:

查找资料知道用换行符换行后在长度属性length中是不把换行符计算在内的,而maxlength属性却把换行符算进去了,所以导致了此类问题,

经过此问题的修改,发现空格字符在length中占了6的长度,那么空格 也是占了6个字符,这里面会不会有联系呢,而且value值也是空格显示的,此处疑问有待解惑。

最终解决代码:

$('.textarea_box textarea').on("keyup",function(e){
                $(this).autosize();
                // 取出回车字符
                var textareaVal = (($(this).val().replace(/<(.+?)>/gi,"&lt;$1&gt;")).replace(/ /gi,"&nbsp;")).replace(/\n/gi,"|");
                // 回车数量
                var entLen = textareaVal.split('|').length-1;
                // 不包含回车的数量
                var strLen = textareaVal.split('|').join('').length;
                $(this).attr('maxlength',150+(entLen*2));
                var nbspStr = textareaVal.replace(/ /gi,"&nbsp;");
                // 空格数量
                var nbspLen = 0;
                nbspLen = nbspStr.split('&nbsp;').length-1;
                len = (strLen + nbspLen) - (nbspLen*6);
                // 以下代码是把回车符计算在内
//                var entLen = textareaVal.split('|').length-1;
//                console.log(entLen);
//                $(this).attr('maxlength',30+entLen);
//                var nbspStr = textareaVal.replace(/ /gi,"&nbsp;");
//                // 空格数量
//                var nbspLen = 0;
//                nbspLen = nbspStr.split('&nbsp;').length-1;
//                len = (textareaVal.length + nbspLen) - (nbspLen*6);
                
                $('.textarea_box span').text( len +'/30' );
            });
var textareaVal = (($(this).val().replace(/<(.+?)>/gi,"&lt;$1&gt;")).replace(/ /gi,"&nbsp;")).replace(/\n/gi,"|");此段代码网络上找的还没明白原理

代码中还有个问题点就是:回车符是占用了一个长度位的,但是需entLen*2才能解决问题,,,回车符换成|后若输入|也会产生问题,

由于时间问题就不一一列出了,

补充:

后来自己又写了个demo,其实空格还是占一个字符位的,处理回车数量的方法

replace(/ /gi,"&nbsp;")

影响了空格的length;空格已经被&nbsp;替换了,

由于输入法的不同会导致输入后字数虽然没有输入但是len还是会增加,修改代码:

                var len = 0;    
                $('.textarea_box textarea').on("keyup",function(e){
                    if( len >= 30 && e.keyCode != 8 ){
                        return;
                    }else{
                        // 取出回车字符
                        var textareaVal = (($(this).val().replace(/<(.+?)>/gi,"&lt;$1&gt;")).replace(/ /gi,"&nbsp;")).replace(/\n/gi,"|");
                        // 回车数量
                        var entLen = textareaVal.split('|').length-1;
                        // 不包含回车的数量
                        var strLen = textareaVal.split('|').join('').length;
                        $(this).attr('maxlength',30+(entLen*2));
                        var nbspStr = textareaVal.replace(/ /gi,"&nbsp;");
                        // 空格数量
                        var nbspLen = 0;
                        nbspLen = nbspStr.split('&nbsp;').length-1;
                        len = (strLen + nbspLen) - (nbspLen*6);
                        $('.textarea_box span').text( len +'/30' );
                    }
                });

 补充:上面代码还是会产生问题,就是文本的复制粘贴,输入法不一样时也会产生问题,

通过查找资料,了解到input的即时搜索功能。可以通过监听propertychange事件来实现。

propertychange和input事件
input是标准的浏览器事件,一般应用于input元素,当input的value发生变化就会发生,无论是键盘输入还是鼠标黏贴的改变都能及时监听到变化。propertychange,只要当前对象属性发生改变。
如此代码改为:
      var len = 0;    
            $('.textarea_box textarea').on("input propertychange",function(e){
                if( len >= 150 && e.keyCode == 8 ){
                    return;
                }else{
                    // 取出回车字符
                    var textareaVal = ($(this).val().replace(/<(.+?)>/gi,"&lt;$1&gt;")).replace(/\n/gi,"|");
                    // 回车数量
                    var entLen = textareaVal.split('|').length-1;
                    // 不包含回车的数量
                    var strLen = textareaVal.split('|').join('').length;
                    $(this).attr('maxlength',150+(entLen*2));
                    len = strLen;
                    if( len >= 150 ){
                        len = 150;
                    };
                    $('.textarea_box span').text( len +'/150' );
                }
            });

 

 

 

 

 

转载于:https://www.cnblogs.com/lchuang/p/6593334.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
el-input textarea限制输入字数可以通过设置maxlength属性来实现。在引用中的代码中,可以看到maxlength="33",这表示该输入框最多可以输入33个字符。当输入的字符超过这个限制时,会自动截断多余的字符。另外,通过设置show-word-limit属性为true,可以显示当前已输入字符数和最大字符数的提示信息。 另外,在引用的代码中,可以看到在onkeyup事件中使用正则表达式value=value.replace(/[^\d\n]/g,'')来过滤非数字和换行符输入。这样可以确保只能输入数字和换行。 综上所述,el-input textarea限制输入字数可以通过设置maxlength属性和正则表达式过滤非法输入来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [js vue input textarea 限制每行输入字数,限制输入行数](https://blog.csdn.net/xhanguomzhu/article/details/108747038)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [el-input textarea显示自定义剩余字数](https://blog.csdn.net/qq_42396791/article/details/126159681)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [正则表达式](https://download.csdn.net/download/u013013722/8220345)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值