热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

统筹pc和挪动端的textarea字数监控的完成要领

一、需求论述和经常运用的处置惩罚方案制造一个文本框限定最大字数,及时监听当前已输入的字数,并显现出来。期初我完成这个功用的要领很简单:给textarea控件增加onkeyup事宜要

一、需求论述和经常运用的处置惩罚方案

制造一个文本框限定最大字数,及时监听当前已输入的字数,并显现出来。期初我完成这个功用的要领很简单:给textarea控件增加onkeyup事宜要领,在要领中将textarea值的长度打印出来,并给textarea增加一个maxlength属性设置长度限定即可。代码以下:



0/10


var txt0 = document.getElementById("txt0");
var txtNum0 = document.getElementById("txtNum0");
txt0.addEventListener("keyup",function(){
txtNum0.textCOntent= txt0.value.length;
});

二、存在的题目

如许貌似很简单就完成了,在英文输入法下一切还都ok,但当我们用输入法输入中文时,题目很快就来了,比方我们要输入“文章”一词就要输入“wenzhang”浏览器会监听到8词keyup事宜。在一些浏览器(如safari)中,假如这个历程凌驾maxlength甚至会阻挠你继承输入。因而纯真的监听keyup事宜显现是不够的。

《统筹pc和挪动端的textarea字数监控的完成要领》
每次按下键盘就会触发监听事宜

三、题目的处置惩罚

经由查阅先辈们的处置惩罚方案,发现了两个之前没有听说过的属性“compositionstart”和“compositionend”。
MDN上的诠释:compositionstart 事宜触发于一段笔墨的输入之前(类似于 keydown 事宜,然则该事宜仅在多少可见字符的输入之前,而这些可见字符的输入能够须要一连串的键盘操纵、语音辨认或许点击输入法的备选词)。
compositionend就是对应的就是一段笔墨输入的事宜。

有了这两个事宜,我们就能够做一个“开关”,一旦检测到开始运用输入法输入一段笔墨了,就把这个“开关翻开”,检测到一段笔墨输入终了了,就封闭这个“开关”。接下来我们在之前的keyup要领中增加一个剖断前提,假如开关封闭,一般打印出textaarea值的长度;假如开关翻开,住手打印。而输入一段笔墨时,监听输入完成的事宜“compositionend”,将textarea的值的长度打印出来。如许不管是不是开启了输入法都能准确的打印出控件值的长度了。

代码以下:(个中变量chnIpt就是代表是不是开启了输入法举行输入的症结变量“开关”)

var txt0 = document.getElementById("txt0");
var txtNum0 = document.getElementById("txtNum0");
var chnIpt0 = false;
txt0.addEventListener("keyup",function(){
if(chnIpt0 ==false){
countTxt();
}
});
txt0.addEventListener("compositionstart",function(){
chnIpt0 = true;
})
txt0.addEventListener("compositionend",function(){
chnIpt0 = false;
countTxt();
})
function countTxt(){
if(chnIpt0 == false){
txtNum0.textCOntent= txt0.value.length;
}
}

云云完成的结果就是英文输入法下没摊开键盘就会举行一次字数统计,输入法输入中文时,输入结束时才会统计字数。

四、完成复用

固然一个完整的插件一定是能够复用的。假如页面里须要多个文本框都要限定字数怎样完成。
我们须要斟酌以下几个题目:

  1. 症结元素(文本框txt和用于显现字数的txtNum)的变量建立和元素猎取怎样完成?
  2. 同是监听“keyup”和“compositionend”怎样辨别差别的textarea

要处置惩罚题目1,起首想到建立一个数组,数组中的每个元素经由过程差别的Id猎取一个元素。一个自力的历程当中我们须要猎取两个元素:txt和txtNun,一个症结变量chnIpt,因而我们要建立三个数组。为了轻易明白,假定页面中有须要三组控件:



0/10





0/10





0/10


则建立数组的历程:

var txt0 = document.getElementById("txt0");
var txt1 = document.getElementById("txt1");
var txt2 = document.getElementById("txt2");
var txtNum0 = document.getElementById("txtNum0");
var txtNum1 = document.getElementById("txtNum1");
var txtNum2 = document.getElementById("txtNum2");
var chnIpt0 = false;
var chnIpt1 = false;
var chnIpt2 = false;
var txt=[txt0,txt1,txt2];
var txtNum=[txtNum0,txtNum1,txtNum2];
var chnIpt=[chnIpt0,chnIpt1,chnIpt2];

如许txt就是textarea控件的数组,txtNum就是实际字数的标签的数组,chnIpt就是推断“开关”的症结变量数组,以待挪用。

如今思索第二个题目“同是监听“keyup”和“compositionend”怎样辨别差别的textarea”。或许说,我们怎样推断当前输入的textarea是txt元素中的第几个呢。

这里就须要表单控件都具有的focus事宜举行区分,在focus事宜的要领中传入代表数组索引的参数,从而挑选挪用数组中响应谁人元素。

代码以下:(ff(i)即为focus事宜挪用的要领参数为索引值)

function ff(i){
txt[i].addEventListener("keyup",function(){
if(chnIpt[i] ==false){
txtNum[i].textCOntent= txt[i].value.length;
}
});
txt[i].addEventListener("compositionstart",function(){
chnIpt[i] = true;
});
txt[i].addEventListener("compositionend",function(){
chnIpt[i] = false;
txtNum[i].textCOntent= txt[i].value.length;
});
}

我们再来斟酌末了一个题目。现在是已知页面中须要几组文本框的状况,我们能够手动建立,费时辛苦代码也不美观。

进一步优化一下建立数组的历程:给每个自力的组件一个class,猎取具有这个class的元素的长度,轮回这个class的长度,给数组中增加元素即可。云云处置惩罚,援用一段剧本没必要再做变动,只须要在html中增加响应的组件即可。
JS代码以下

var txt = [],txtNum = [],chnIpt = [];
var needCount = document.getElementsByClassName("needCount");
for(var i=0;i txt[i] = document.getElementById("txt"+i);
txtNum[i] = document.getElementById("txtNum"+i);
chnIpt[i] = false;
}

终究完整的JS代码:

var txt = [],txtNum = [],chnIpt = [];
var needCount = document.getElementsByClassName("needCount");
for(var i=0;i txt[i] = document.getElementById("txt"+i);
txtNum[i] = document.getElementById("txtNum"+i);
chnIpt[i] = false;
}
function ff(i){
txt[i].addEventListener("keyup",function(){
if(chnIpt[i] ==false){
txtNum[i].textCOntent= txt[i].value.length;
}
});
txt[i].addEventListener("compositionstart",function(){
chnIpt[i] = true;
});
txt[i].addEventListener("compositionend",function(){
chnIpt[i] = false;
txtNum[i].textCOntent= txt[i].value.length;
});
}

《统筹pc和挪动端的textarea字数监控的完成要领》
一组字符输入完整之前不会监听自述变化

demo链接:点我

五、兼容性

云云完成学问该组件我尝试以来最为靠近预期的完成要领,在pc端主流浏览器(ie9以上),安卓、ios的原生键盘输入、“讯飞语音”的语音输入法结果优越。但在一些特定状况下仍然会出现题目,比如:

  1. 没法监听ios自带输入法的语音辨认输入
  2. 猎豹浏览器下运用鼠标点选词组会结算“keyup”而不是“compositionend”,而且会使maxlength失效。再次监听到“keyup”恢复一般。

以上两个题目至今没有找到处置惩罚,以及,我发如今火狐浏览器下会实行两次“compositionend”,但并不影响字数统计。诸如这些疑问还烦请网上的列位高人如碰到类似题目赋予鄙人指正与指导。

末了我想说一句话:“假如事宜不再有浏览器之间的差别,天下将变成优美的人世!”


推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了10分钟了解Android的事件分发相关的知识,希望对你有一定的参考价值。什么是事件分发?大家 ... [详细]
  • 开发笔记:UEditor调用上传图片上传文件等模块
    1、引入ue相关文件,写好初始代码为了更好的封装整一个单独的插件,这里我们要做到示例化ue后隐藏网页中的编辑窗口,并移除焦点。 ... [详细]
author-avatar
曹彩节
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有