结合Vue控制字符和字节的显示个数的示例


Posted in Javascript onMay 17, 2018

需求

需求:结合Vue实现下面的效果

  1. 输入框中最多输入16个字符
  2. 汉字最多显示5个,超出部分以...显示
  3. 英文最多显示10个,超出部分以...显示

实现

搭建简单页面,并设置简单样式

在正式开始写核心代码之前,要先把代码结构搭建起来,这样后面写的时候就会看着简洁点了。

首先需要一个输入框用来输入内容,其次需要一个元素,用来显示输入框中的内容,实现数据的双向绑定。

其中,输入内容的最大长度是可以通过input标签的属性来指定的。

<div id="app">
 <input v-model="txt" class="clsinp" maxlength="16" placeholder="请输入内容" type="text">
 <div class="clsmsg">
  <p>内容:<span>{{txt}}</span></p>
  <p>输入的字符个数:<span>{{computedCharLen}}</span></p>
  <p>输入的字节个数:<span>{{computedByteLen}}</span></p>
 </div>
</div>

页面的结构已经搭建完成了,那下面就是做一些简单的样式优化了。

* { margin: 0; padding: 0; -webkit-box-sizing: border-box; box-sizing: border-box; }
body { background: #efefef; }
.clsinp { width: 100%; height: 40px; outline: none; line-height: 40px; font-size: 16px; padding: 0 10px; margin-top: 20px; color: blue; }
.clsmsg { padding: 10px 10px; }
.clsmsg span { color: blue; }

最后一步应该就是引入Vue,然后搭建一些简单的数据内容。

var vm = new Vue({
 el: '#app',
 data() {
  return {
   txt: ''
  }
 },
 // 后期代码在下面补充
})

ASCII范围内与范围外

了解ASCII的内容,请移步到http://www.asciima.com/

ASCII中包含256个字符,因此超过256之外的字符,全部都是非ASCII字符,一般情况下,汉字就是在这个范围中。

因此,编码不在0-255的字符可以使用正则表达式/[^\x00-\xff]/g来进行匹配。这个时候就提供了一个思路,如果不是ASCII码中的字符,那么就默认它占了两个字节。

我们修改一下页面结构,输出一些测试信息:

<div id="app">
 <input v-model="txt" class="clsinp" maxlength="16" placeholder="请输入内容" type="text">
 <div class="clsmsg">
  <p>内容:<span>{{txt}}</span></p>
  <p>输入的字符个数:<span>{{computedCharLen}}</span></p>
  <p>输入的字节个数:<span>{{computedByteLen}}</span></p>
 </div>
</div>

补充需要的计算属性:

computed: {
 // 获取字符的个数
 computedCharLen() {
  return this.txt.length
 },
 // 获取字节的个数
 computedByteLen() {
  return this.txt.replace(/[^\x00-\xff]/g, '01').length
 }
}

这个时候,我们输入内容,出现下面的效果:

结合Vue控制字符和字节的显示个数的示例

这个时候会发现,已经实现,ASCII码范围内的占1位,超出范围的占2位。

控制显示的内容

内容显示使用计算属性来实现:

<p>内容:<span>{{computedTxt}}</span></p>
// 控制显示的内容
computedTxt() {
 return this.methodGetByteLen(this.txt, 10)
}

下面补充一下methodGetByteLen方法:

/**
 * str 需要控制的字符串
 * len 字节的长度,如5个汉字,10个英文,输入参数就是10
 */
methodGetByteLen(str, len) {
 // 如果字节的长度小于控制的长度,那么直接返回
 if (this.computedByteLen <= len) {
  return str
 }
 for (let i = Math.floor(len / 2); i < str.length; i++) {
  if (str.substr(0, i).replace(/[^\x00-\xff]/g, '01').length >= len) {
   // Math.floor(i / 2) * 这里是控制特殊情况的显示
   // 如 '一二aaa一二三四',显示的结果就是 '一二aaa一...'
   return str.substr(0, Math.floor(i / 2) * 2) + '...'
  }
 }
}

最终的显示情况没有超过最大指定长度的情况

结合Vue控制字符和字节的显示个数的示例

超过最大指定长度(汉字输入)

结合Vue控制字符和字节的显示个数的示例

超过最大指定长度(数字输入)

结合Vue控制字符和字节的显示个数的示例

超过最大指定长度(汉字和字母的组合)

结合Vue控制字符和字节的显示个数的示例

完整代码

最后,把最终代码粘贴出来:

<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta txt="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
 <style type="text/css">
  * {
   margin: 0;
   padding: 0;
   -webkit-box-sizing: border-box;
   box-sizing: border-box;
  }

  body {
   background: #efefef;
  }

  .clsinp {
   width: 100%;
   height: 40px;
   outline: none;
   line-height: 40px;
   font-size: 16px;
   padding: 0 10px;
   margin-top: 20px;
   color: blue;
  }

  .clsmsg {
   padding: 10px 10px;
  }

  .clsmsg span {
   color: blue;
  }

 </style>
</head>

<body>
 <div id="app">
  <input v-model="txt" class="clsinp" maxlength="16" placeholder="请输入内容" type="text">
  <div class="clsmsg">
   <p>内容:<span>{{computedTxt}}</span></p>
   <p>输入的字符个数:<span>{{computedCharLen}}</span></p>
   <p>输入的字节个数:<span>{{computedByteLen}}</span></p>
  </div>
 </div>
</body>

</html>

<script type="text/javascript" src="./vue2.5.1.js"></script>
<script type="text/javascript">
 var vm = new Vue({
  el: '#app',
  data() {
   return {
    txt: ''
   }
  },
  // 后期代码在下面补充
  methods: {
   methodGetByteLen(str, len) {
    if (this.computedByteLen <= len) {
     return str
    }
    for (let i = Math.floor(len / 2); i < str.length; i++) {
     if (str.substr(0, i).replace(/[^\x00-\xff]/g, '01').length >= len) {
      return str.substr(0, Math.floor(i / 2) * 2) + '...'
     }
    }
   }
  },
  computed: {
   // 获取字符的个数
   computedCharLen() {
    return this.txt.length
   },
   // 获取字节的个数
   computedByteLen() {
    return this.txt.replace(/[^\x00-\xff]/g, '01').length
   },
   // 控制显示的内容
   computedTxt() {
    return this.methodGetByteLen(this.txt, 10)
   }
  }
 })

</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript字母大小写转换的4个函数详解
May 09 Javascript
jquery浏览器滚动加载技术实现方案
Jun 03 Javascript
使用jQuery实现星级评分代码分享
Dec 09 Javascript
分享一个常用的javascript静态类
Dec 31 Javascript
jQuery实现固定在网页顶部的菜单效果代码
Sep 02 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
Mar 25 Javascript
jQuery获取select选中的option的value值实现方法
Aug 29 Javascript
JS Canvas定时器模拟动态加载动画
Sep 17 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
Oct 24 Javascript
JS仿JQuery选择器功能
Mar 08 Javascript
使用3D引擎threeJS实现星空粒子移动效果
Sep 13 Javascript
vue日历/日程提醒/html5本地缓存功能
Sep 02 Javascript
微信小程序使用form表单获取输入框数据的实例代码
May 17 #Javascript
AngularJS实现的base64编码与解码功能示例
May 17 #Javascript
解决修复npm安装全局模块权限的问题
May 17 #Javascript
npm 下载指定版本的组件方法
May 17 #Javascript
ES6之模版字符串的具体使用
May 17 #Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
May 17 #Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
May 17 #Javascript
You might like
解析php中const与define的应用区别
2013/06/18 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
2017/08/04 PHP
thinkPHP5框架自定义验证器实现方法分析
2018/06/11 PHP
Code:findPosX 和 findPosY
2006/12/20 Javascript
jquery实现文本框鼠标右击无效以及不能输入的代码
2010/11/05 Javascript
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
AngularJS 中的Promise --- $q服务详解
2016/09/14 Javascript
PHP+jquery+ajax实现分页
2016/12/09 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
AngularJS的$location使用方法详解
2017/10/19 Javascript
Angular2.0/4.0 使用Echarts图表的示例代码
2017/12/07 Javascript
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
React+Redux实现简单的待办事项列表ToDoList
2019/09/29 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
Vue中fragment.js使用方法小结
2020/02/17 Javascript
js调用网络摄像头的方法
2020/12/05 Javascript
[20:30]职业巡回赛回顾
2018/08/09 DOTA
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
Python 绘制酷炫的三维图步骤详解
2019/07/12 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
python实现画图工具
2020/08/27 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
顶岗实习接收函
2014/01/09 职场文书
机械工程师岗位职责
2014/06/16 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
2015年秋季学校开学标语
2015/07/16 职场文书
2016新年致辞
2015/08/01 职场文书
小学班主任教育随笔
2015/08/15 职场文书
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis