为textarea 增加 maxlength 屬性

本文介绍了几种限制HTML textarea输入字符数量的方法,包括使用onkeyup事件实时限制、定义maxlength属性配合JavaScript进行验证,以及通过禁用右键防止粘贴超过限制等。

如果只是单纯地想限制 textarea 中的字數,可用:

<textarea onkeyup="this.value = this.value.slice(0, 10)"></textarea>

<textarea onkeyup="this.value = this.value.substring(0, 10)"></textarea>

 

也可以这样子:

首先在textarea 上定义一个 maxlength 属性:
<textarea rows="2" cols="20" maxlength="10" onkeydown="checklength(this);"></textarea>
然后添加这个方法就行了!
function checklength(obj) {
        var max = obj.maxlength;
        if(max == null || max == "" || max == undefined) {
            return;
        }
        if(obj.value.length > max) {
            alert("请不要超过最大长度:" + max);
            obj.value=obj.value.substring(0,(max-1));
            return;
        }
    }

 

还可以这样子:

      在textarea中输入内容后就判断是否超出了maxLength,如果超出就按照maxLength截取textare的值,如果用鼠标来拷贝粘贴就没法调用判断maxLength的方法,解决办法就是当textarea获取焦点时把鼠标右键失效,失去焦点时再恢复鼠标右键
      这个方法从功能上解决了textarea的maxLength问题,但还不是很完美,在输入超过maxLength的字符后光标会有闪烁,因为是截取回填,没有像input的maxLength那样真正不让输入

<script type="text/javascript">
  var textarea_maxlen = {
    isMax : function (){
      var textarea = document.getElementById("area");
      var max_length = textarea.maxLength;
      if(textarea.value.length > max_length){
        textarea.value = textarea.value.substring(0, max_length);
      }
    },
    
    disabledRightMouse : function (){
      document.oncontextmenu = function (){ return false; }
    },
    
    enabledRightMouse : function (){
      document.oncontextmenu = null;
    }


  };
</script>


<textarea id=
"area" maxLength="10"   onkeyup="textarea_maxlen.isMax()"
  onfocus=
"textarea_maxlen.disabledRightMouse()"  onblur="textarea_maxlen.enabledRightMouse()"
>
</textarea>

 

还是第一种方法方便有效

### 问题分析 在微信小程序中,`textarea` 的 `maxlength` 属性通常用于限制用户输入的最大字符数。然而,在某些情况下,当文本是从数据库获取并设置到 `textarea` 中时,`maxlength` 可能会失效,导致超出限制的字符仍然显示在输入框中。 根据已有信息,`maxlength` 在 iOS 设备上可能会因输入法的行为而表现异常,但此问题也可能出现在从数据源动态赋值的情况下。如果 `textarea` 的初始值是通过数据绑定(如 `value="{{content}}"`)设置的,并且该值已经超过了设定的 `maxlength`,则输入框可能不会自动截断内容[^1]。 --- ### 解决方案 #### 1. 手动控制输入长度 为了避免 `maxlength` 失效,可以在数据绑定之前对内容进行处理。例如,在页面加载或数据更新时,手动截取字符串至最大允许长度: ```javascript Page({ data: { content: '' }, onLoad() { const dbContent = this.getDatabaseContent(); // 假设这是从数据库获取的内容 const maxLength = 200; const truncatedContent = dbContent.slice(0, maxLength); this.setData({ content: truncatedContent }); } }); ``` 这样可以确保即使 `maxlength` 属性未被正确执行,内容也不会超过预期长度。 #### 2. 使用 `bindinput` 进行实时控制 除了依赖 `maxlength`,还可以结合 `bindinput` 事件来实现更精确的控制。在每次输入时检查当前值的长度,并在超出限制时提示用户或自动截断: ```javascript Page({ data: { content: '', maxLength: 200 }, inputMsg(e) { let value = e.detail.value; const { maxLength } = this.data; if (value.length > maxLength) { value = value.slice(0, maxLength); } this.setData({ content: value }); } }); ``` WXML 中绑定事件: ```html <textarea value="{{content}}" bindinput="inputMsg" maxlength="200"></textarea> ``` 这种方式可以有效避免 `maxlength` 失效带来的问题,并提供更好的用户体验。 #### 3. 确保页面渲染时同步更新 如果 `textarea` 是通过异步请求从数据库获取数据后渲染的,需确保在数据更新后重新计算和设置内容长度。可使用 `setData` 回调函数保证数据同步: ```javascript this.setData({ content: dbContent }, () => { // 数据更新后再进行一次长度校验 const { content, maxLength } = this.data; if (content.length > maxLength) { this.setData({ content: content.slice(0, maxLength) }); } }); ``` --- ### 其他注意事项 - **fixed 属性**:在某些情况下,若用户粘贴大量文本导致内容滚动异常,可考虑添加 `fixed="true"` 属性,使输入框固定在可视区域内,提升交互体验[^2]。 - **兼容性测试**:由于不同设备和系统版本对 `maxlength` 的支持可能存在差异,建议在多种环境下进行测试,确保行为一致。 --- ### 示例代码 ```html <!-- WXML --> <textarea value="{{content}}" bindinput="inputMsg" maxlength="200" fixed="true"> </textarea> <view>已输入 {{content.length}} / 200 字</view> ``` ```javascript // JS Page({ data: { content: '', maxLength: 200 }, onLoad() { const dbContent = this.getDatabaseContent(); // 模拟从数据库获取内容 this.setData({ content: dbContent }, () => { const { content, maxLength } = this.data; if (content.length > maxLength) { this.setData({ content: content.slice(0, maxLength) }); } }); }, inputMsg(e) { let value = e.detail.value; const { maxLength } = this.data; if (value.length > maxLength) { value = value.slice(0, maxLength); } this.setData({ content: value }); } }); ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值