小程序textarea字数限制与输入计算

微信小程序文本域字数限制
本文介绍如何在微信小程序中实现文本域的字数限制和实时字数统计功能,通过示例代码展示了如何设置maxlength属性及使用bindinput事件监听输入,实时更新已输入字数。

微信小程序——文本域字数限制和字数输入统计

示例代码

wxml:

<textarea   bindinput='input' rows="3" placeholder="XXXX" maxlength="60" hidden='{{dleg3}}'>
        <text class="currentWordNumber">{{currentNoteLen|0}}/{{noteMaxLen}}个字</text>
</textarea>
wxss

.currentWordNumber{
  font-size: 28rpx;
  color: gray;
  position: absolute;
  left: 520rpx;
  top: -6rpx;
  margin-top: 40px;
}
js

data: {
    noteMaxLen: 60,         //详细地址的字数限制
    currentNoteLen: 0,          //输入的字数
  },


  input(event) {
    var value = event.detail.value,
      len = parseInt(value.length);
    let that = this;
    this.setData({
      currentNoteLen: len
    });
### 小程序中实现 `textarea` 输入行数限制的方法 在小程序开发过程中,可以通过监听输入事件并动态计算当前已输入的内容对应的行数来实现对 `textarea` 的行数限制功能。以下是具体的实现方式: #### 方法概述 通过绑定 `bindinput` 事件,在每次用户输入时实时检测内容的高度变化或者基于正则表达式的逻辑判断行数是否超出设定的限制。 --- #### 基于高度检测的方式 此方法适用于需要精确控制可视区域内的行数场景。核心思路是利用 `textarea` 高度的变化来推算实际显示的行数。 ##### 实现代码 ```javascript // WXML 文件 <textarea bindinput="onInput" maxlength="{{maxLength}}" style="height:{{textHeight}}px;" placeholder="请输入内容"></textarea> // JS 文件 Page({ data: { maxLength: -1, // 设置为-1表示不限制字数 textHeight: 50, // 初始高度 (单位 px) maxRows: 5, // 最大允许的行数 lineHeight: 20 // 单行高度 (可根据体大小调整) }, onInput(e) { const { value } = e.detail; // 动态设置 height 属性 this.setData({ textHeight: Math.min(value.split('\n').length * this.data.lineHeight, this.data.maxRows * this.data.lineHeight) }); if (value.split('\n').length > this.data.maxRows) { wx.showToast({ title: '超过最大行数', icon: 'none' }); } } }); ``` 此处的关键在于通过符串中的换行符 `\n` 来统计行数,并根据每行固定的高度动态调整 `textarea` 的样式[^1]。 --- #### 基于符数量估算的方式 该方法适合无法直接依赖高度的情况,而是通过分析输入内容的符分布来间接推测行数。 ##### 实现代码 ```javascript // WXML 文件 <textarea bindinput="onInput" maxlength="-1" placeholder="请输入内容"></textarea> // JS 文件 Page({ data: { maxRows: 3, rowLengthLimit: 20 // 每行最多支持的符数 }, onInput(e) { let inputValue = e.detail.value; // 计算总行数 let rows = 0; inputValue.split(/\r?\n/).forEach((line) => { rows += Math.ceil(line.replace(/[\u4e00-\u9fa5]/g, "aa").length / this.data.rowLengthLimit); }); if (rows > this.data.maxRows) { wx.showToast({ title: '已经超过限定行数', icon: 'none' }); // 截断多余部分 const lines = inputValue.split(/\r?\n/).slice(0, this.data.maxRows); this.setData({ inputValue: lines.join("\n") }); } } }); ``` 在此方案中,采用了类似的正则替换策略来模拟中文占用双倍宽度的效果[^3],并通过逐行累加的方式来判定总的行数是否超限。 --- #### Vue.js 中的解决方案 对于使用 Vue 构建的小程序项目,则可以直接借助其数据驱动视图更新机制完成相同目标。 ##### 示例代码片段 ```html <u-input v-model="content" @input="handleInput" type="textarea" :maxlength="-1" /> ``` ```javascript export default { data() { return { content: '', maxRows: 4, charPerRow: 20 }; }, methods: { handleInput(val) { let currentRows = val.split(/\r?\n/) .map(str => Math.ceil( str.replace(/[\u4E00-\u9FA5]/g,'AA').length / this.charPerRow)) .reduce((a,b)=> a+b ,0); if(currentRows>this.maxRows){ alert('超出规定行数'); this.content=val.substring(0,val.lastIndexOf('\n')); } } } } ``` 注意这里同样运用到了之前提到过的正则匹配技术去衡量每一行的实际占据空间[^2]^。 --- ### 总结 以上两种主要途径均能有效达成限制小程序文本域输入行数的目的。开发者应依据具体需求选取合适的技术路线实施部署。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值