结合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 相关文章推荐
jquery实现微博文字输入框 输入时显示输入字数 效果实现
Jul 12 Javascript
js将当前时间格式转换成时间搓(自写)
Sep 26 Javascript
jQuery的context属性用法实例
Dec 27 Javascript
Bootstrap实现水平排列的表单
Jul 04 Javascript
纯JS单页面赛车游戏制作代码分享
Mar 03 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
Jul 12 Javascript
Node.js 使用request模块下载文件的实例
Sep 05 Javascript
Nuxt升级2.0.0时出现的问题(小结)
Oct 08 Javascript
Vue中JS动画与Velocity.js的结合使用
Feb 13 Javascript
vue-froala-wysiwyg 富文本编辑器功能
Sep 19 Javascript
vue学习笔记之给组件绑定原生事件操作示例
Feb 27 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
May 09 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的加密方式及原理
2012/06/14 PHP
laravel-admin 实现给grid的列添加行数序号的方法
2019/10/08 PHP
JavaScript 特殊字符
2007/04/05 Javascript
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
js 判断checkbox是否选中的操作方法
2012/11/09 Javascript
js 与 php 通过json数据进行通讯示例
2014/03/26 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
Bootstrap每天必学之面板
2015/11/30 Javascript
省市二级联动小案例讲解
2016/07/24 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
微信小程序 底部导航栏目开发资料
2016/12/05 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
2018/08/08 Javascript
原生JS实现随机点名项目的实例代码
2019/04/30 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
2020/07/27 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
python的dict,set,list,tuple应用详解
2014/07/24 Python
python生成IP段的方法
2015/07/07 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
Python清空文件并替换内容的实例
2018/10/22 Python
python3 线性回归验证方法
2019/07/09 Python
python 实现任务管理清单案例
2020/04/25 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
Python如何对齐字符串
2020/07/30 Python
python实现自动打卡的示例代码
2020/10/10 Python
HTML5 Canvas渐进填充与透明实现图像的Mask效果
2013/07/11 HTML / CSS
canvas版人体时钟的实现示例
2021/01/29 HTML / CSS
英国户外服装品牌:Craghoppers
2019/04/25 全球购物
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
Python实现抖音热搜定时爬取功能
2022/03/16 Python
Windows server 2003卸载和安装IIS的图文教程
2022/07/15 Servers