结合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 相关文章推荐
获取客户端电脑日期时间js代码(jquery)
Sep 12 Javascript
JavaScript作用域与作用域链深入解析
Dec 06 Javascript
浏览器窗口加载和大小改变事件示例
Feb 27 Javascript
JavaScript判断变量是否为空的自定义函数分享
Jan 31 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
Jul 17 Javascript
BootStrap创建响应式导航条实例代码
May 31 Javascript
JS实现n秒后自动跳转的两种方法
Nov 30 Javascript
Bootstrap笔记—折叠实例代码
Mar 13 Javascript
微信小程序 页面滑动事件的实例详解
Oct 12 Javascript
React.Js添加与删除onScroll事件的方法详解
Nov 03 Javascript
小程序tab页无法传递参数的方法
Aug 03 Javascript
微信小程序与公众号卡券/会员打通的问题
Jul 25 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 在线打包_支持子目录
2008/06/28 PHP
php中将时间差转换为字符串提示的实现代码
2011/08/08 PHP
PHP中echo和print的区别
2014/08/28 PHP
thinkPHP5框架导出Excel文件简单操作示例
2018/08/03 PHP
详解php中生成标准uuid(guid)的方法
2019/04/28 PHP
javascript 变量作用域 代码分析
2009/06/26 Javascript
jQuery过滤选择器:not()方法使用介绍
2014/04/20 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
jquery根据属性和index来查找属性值并操作
2014/07/25 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
2015/03/02 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
vue如何获取点击事件源的方法
2017/08/10 Javascript
Angular6使用forRoot() 注册单一实例服务问题
2019/08/27 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
vue3.0搭配.net core实现文件上传组件
2020/10/29 Javascript
深入分析python中整型不会溢出问题
2018/06/18 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
2020/01/21 Python
Smashbox英国官网:美国知名彩妆品牌
2017/11/13 全球购物
美国环保妈妈、儿童和婴儿用品购物网站:The Tot
2019/11/24 全球购物
后勤人员岗位职责
2013/12/17 职场文书
电子商务专业自我鉴定
2013/12/18 职场文书
教学大赛获奖感言
2014/01/15 职场文书
美术指导求职信
2014/03/17 职场文书
《长征》教学反思
2014/04/27 职场文书
多媒体教室标语
2014/06/26 职场文书
商场消防安全责任书
2014/07/29 职场文书
乡镇务虚会发言材料
2014/10/20 职场文书
乡镇司法所2015年度工作总结
2015/10/14 职场文书
Redis安装启动及常见数据类型
2021/04/14 Redis
MySQL中的隐藏列的具体查看
2021/09/04 MySQL
Go语言的协程上下文的几个方法和用法
2022/04/11 Golang