结合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 硬盘序列号+其它硬件信息
Dec 23 Javascript
如何将网页表格内容导入excel
Feb 18 Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
Mar 03 Javascript
详解AngularJS中的表格使用
Jun 16 Javascript
Javascript模仿淘宝信用评价实例(附源码)
Nov 26 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
Jun 20 Javascript
如何理解jQuery中的ajaxSubmit方法
Mar 13 Javascript
最基础的vue.js双向绑定操作
Aug 23 Javascript
angularjs实现柱状图动态加载的示例
Dec 11 Javascript
JavaScript判断浏览器版本的方法
Nov 03 Javascript
JavaScript定时器使用方法详解
Mar 26 Javascript
JS实现躲避粒子小游戏
Jun 18 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实现多服务器session共享之NFS共享的方法
2007/03/16 PHP
php多维数组去掉重复值示例分享
2014/03/02 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
PHP发送AT指令实例代码
2016/05/26 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
Laravel框架实现多数据库连接操作详解
2019/07/12 PHP
QQ登录简单实现代码
2021/03/09 Javascript
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
2010/03/02 Javascript
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
angular中使用Socket.io实例代码
2017/06/03 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
2020/08/05 Javascript
[02:09]EHOME夺得首届辉夜杯冠军—现场颁奖仪式
2015/12/28 DOTA
[58:58]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第二场
2018/04/05 DOTA
python数字图像处理实现直方图与均衡化
2018/05/04 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
python多线程同步实例教程
2019/08/11 Python
pandas实现DataFrame显示最大行列,不省略显示实例
2019/12/26 Python
健康监测猫砂:Pretty Litter
2017/05/25 全球购物
易程科技软件测试笔试
2013/03/24 面试题
银行自荐信范文
2013/10/07 职场文书
编辑求职信样本
2013/12/16 职场文书
经销商会议欢迎词
2014/01/11 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书
导游词之峨眉山
2019/12/16 职场文书
html+css实现赛博朋克风格按钮
2021/05/26 HTML / CSS
纯 CSS 自定义多行省略的问题(从原理到实现)
2021/11/11 HTML / CSS
Win7/8.1用户可以免费升级到Windows 11系统吗?
2021/11/21 数码科技