【留言板】可编辑输入框操作总结

闲暇之余,用于加深自己对基础的了解,徒手撸了一个留言板:输入框。废话少说,进入正题。简陋的效果如下(下载代码):

一、定义需求

  1. 可输入文本,以及插入表情。
  2. 兼容性:IE与标准浏览器

二、详细设计

根据需求,我们大致可以想到如下问题:

  1. 兼容性的处理
    1. 事件绑定的兼容性
    2. 可编辑输入框的表情插入兼容性
    3. 获取数据的兼容性
  2. 三个模块
    1. 留言板与ui交互的模块
    2. 表情展示模块
    3. 可编辑输入框的操作模块 因此我规划了如下的类结构:

  • LeaveMsg:实现UI与留言板的交互
  • FaceWrap:实现表情殂的管理,以及相应事件的响应,如显示/隐藏,获取表情,初始化表情列表等。
  • SelectionUitls:实现可编辑输入框的操作,如:插入一个表情、获取数据等。 各模块的兼容性在以下细节中进行介绍。

三、代码实现

1. FaceWrap类(表情列表管理类)

var FaceWrap = function(head, cont, opts){
this.$head = head;
this.$cont = cont;
this.data = ['one', 'two', 'thr'];
var self = this;
var toggle = false;
this.onClickHandHandle = function(evt){
if(!toggle){
self.$cont.style.display = 'block';
toggle = true;
}else{
self.$cont.style.display = 'none';
toggle = false;
}
if(opts.onClickHandHandle){
opts.onClickHandHandle(toggle);
}
}
this.onChooseImg = opts. onChooseImg || function(){}
this.generalFaceImg();
this.bind();
}
var facePt = FaceWrap.prototype;
facePt.generalFaceImg = function(){
var fragment = document.createDocumentFragment();
for( var index =0; index < this.data.length;   index){
var data = this.data[index];
var img = document.createElement('img');
img.setAttribute('src', '../img/face/'   data   '.jpg');
img.setAttribute('data-id', data);
img.setAttribute('class','face-img');
fragment.appendChild(img);
}
this.$cont.appendChild(fragment);
}
facePt.bind = function(){  
if(document.attachEvent){
this.$head.attachEvent('onclick',this.onClickHandHandle);
this.$cont.attachEvent('onclick',this.onChooseImg);
}else{       
this.$head.addEventListener('click',this.onClickHandHandle);
this.$cont.addEventListener('click',this.onChooseImg);
}
}
facePt.hide = function(){
this.onClickHandHandle();
}

需要注意的点:

     1. 在初始化表情列表(generalFaceImg)的时候,用到了Fragment(文档碎片)来提高性能;

     2. 在class中设元素的display为none后,用js是获取不到此元素的display值的。

兼容性有以下几个点:

  1. 事件的绑定:attacheEvent和addEventListener。
  2. classList在ie8-不支持的问题,暂时选择的用setAttribute代替
  3. appendChild全都支持,append在chrome中支持,但ie不支持

2. SelectionUitls类(可编辑输入框管理类)

var SelectionUitls = function(dom){
this.dom = dom;
this.cursorIndex;
}
var pt = SelectionUitls.prototype;
pt.insertDomForStandard = function(dom){
var sel = window.getSelection(); //获取选区集合
var range = sel.getRangeAt(0); //获取第一个选择
range.deleteContents(); //删除选区选重的元素
range.insertNode(dom); //插入元素在选区的首位置
range = range.cloneRange(); //克隆一个选区
range.setStartAfter(dom); //设置选区起点光标位置在指定元素的后面
range.collapse(true);//合并起点、终点光标
sel.removeAllRanges();//移除所有选区
sel.addRange(range); //添加一个选区
}
pt.insertDomForIe = function(dom){
this.dom.focus();
var wrap = document.createElement('div');
wrap.appendChild(dom);
document.selection.createRange().pasteHTML(wrap.innerHTML);
}
pt.insertDom = function(dom){
//光标处插入非元素
if(window.getSelection){
this.insertDomForStandard(dom);
}else{
this.insertDomForIe(dom);
}
}
pt.getContent = function(){
//获取数据
var nodes = this.dom.childNodes;
var datas = [];
for(var index = 0; index < nodes.length; index   ){
var node = nodes[index];
if(node.nodeType == 3){
datas.push(node.textContent || node.nodeValue || node.data);
}else{
datas.push(node.getAttribute('data-id'));
}
}
return datas.join('##');
}

主要内容:

  1. range(选区):IE与标准浏览器的兼容性,值得注意的IE操控选区时,需要让被操控元素(也就是选区所在的元素)获取焦点,否则会失败。
  2. 标准浏览器range的APi可参考此地址:http://www.w3school.com.cn/xmldom/dom_range.asp
  3. 获取数(getContent):将html结构的数据转换为标准的数据,防止脚本攻击。

3. LeaveMsg类(留言板管理类)

var LeaveMsg = function(opts){
this.opts = opts;
this.createFaceWrap();
this.createUitls();
this.curLocation;
}
var leaveMsgPt = LeaveMsg.prototype;
leaveMsgPt._insertFace = function(id){
var img = document.createElement('img');
img.setAttribute('class','face-img');
img.setAttribute('data-id', id);
img.src= '../img/face/'   id   '.jpg';
this.selectionUitls.insertDom(img);
this.faceWrap.hide();
}
leaveMsgPt.createFaceWrap = function(){
var self = this;
var faceOpt = {
onChooseImg:function(evt){
//插入表情,获取位置,获取表情,插入表情
var id = (evt.target||evt.srcElement).getAttribute('data-id');
self._insertFace(id);
}
}
this.faceWrap = new FaceWrap(this.opts.faceHead, this.opts.faceCont, faceOpt);
}
leaveMsgPt.createUitls = function(){
this.selectionUitls = new SelectionUitls(this.opts.area);
}
leaveMsgPt.getContent = function(evt){
this.selectionUitls.getContent();
}

实现FaceWrap、SelectionUitls类与LeaveMsg类的组合,并对UI提供相就的API。

四、使用他们

js部分代码

var leaveMsgArea = document.getElementById('leaveMsgArea');
var faceHead = document.getElementById('head');
var faceCont = document.getElementById('cont');
var leaveMsg = new LeaveMsg({
area: leaveMsgArea,
faceHead: faceHead,
faceCont: faceCont
});

HTML部分代码

<div class="leaveMsgArea" contenteditable="true" id="leaveMsgArea">
</div>
<div class="face-wrap">
<a class="face-head" id="head" href="javascript:void(0)">表情</a>
<div class="face-cont" id="cont">
</div>
</div>
<div class="button-group">
<button type="button" onclick="leaveMsg.getContent(event)" >获取内容</button>
</div>

更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

excel poi3.17导出导入

https://blog.csdn.net/phil_jing/article/details/78307819 转载于:https://www.cnblogs.com/lyon91/p/10450668.html

2021年兰州师大附中高考成绩查询,2021年兰州重点高中名单及排名,兰州高中高考成绩排名榜...

”一千个人眼中&#xff0c;就有一千个哈姆雷特“。关于兰州高职学校排名&#xff0c;每个人的观点也是各不相同&#xff0c;今天就给大家分享一下我心中的兰州高中排名及格局分布&#xff0c;主要参考依据是近年中考录取分数线及高考成绩。数据仅供参考&#xff01;希望对你有…

Android 创建,验证和删除桌面快捷方式 (删除快捷方式测试可用)

测试环境为Adnroid 2.1以上。 第一步&#xff1a;AndroidManifest.xml 权限配置&#xff1a; 添加快捷方式权限&#xff1a; <uses-permission android:name"com.android.launcher.permission.INSTALL_SHORTCUT"/> 验证快捷方式是否存在权限&#xff1a; <u…

ASP.NET存储Session的StateServer

由于公司要对服务器做个负载均衡&#xff0c;所以Web项目在两台前端服务器(web1、web2)各部署了一份。但是在项目中会用到session。当一开始在web1上登陆后&#xff0c;由于web1之后负载可能会变大&#xff0c;就有可能从web1跳转到web2上。从网上找了好多资料&#xff0c;自己…

休眠和UUID标识符

介绍 在我以前的文章中&#xff0c;我谈到了UUID代理密钥以及用例 &#xff0c; 这些用例比更常见的自动增量标识符更合适。 UUID数据库类型 有几种方法可以表示128位UUID&#xff0c;并且每当有疑问时&#xff0c;我都希望向Stack Exchange寻求专家建议。 由于通常对表标识符…

use vue vuex vue-router, not use webpack

vue,vuex,vue-router放在一起能做什么&#xff1f;不用webpack之类的打包工具使用他们是否可行&#xff1f;各位道友在初学vue时是否有这样的困惑。因为现代构建前端项目的一般模式是&#xff1a; 安装webapck&#xff0c;某种是glup,grunt&#xff0c;或者是fis等构建工具然后…

html网页加入一个按钮,在html网页设计中,一个“登录”按钮怎么编写代码?

html网页设计&#xff1a;一个简单的登录界面代码&#xff01;在html网页设计中&#xff0c;一个“登录”按钮怎么编写代码&#xff1f;列如所给图片的“登录”按钮怎么用html代码显示出来&#xff0c;要求能够识别是否输入用户名和密码&#xff01;是这样的效果吗&#xff1f;…

blender的汉化方法!

本人对于此只是初步认知阶段&#xff0c;也许对于电脑高手来说&#xff0c;这只是小儿科。但对于我来说&#xff0c;能够摸索出其中的方法&#xff0c;还是费了一些力气&#xff0c;所以&#xff0c;也蛮有成就感。希望拿来与同是处于初学水平的朋友共同学习。 blender这个软件…

SQL重复记录查询(转载)

1、查找表中多余的重复记录&#xff0c;重复记录是根据单个字段&#xff08;peopleId&#xff09;来判断select * from peoplewhere peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 例二&#xff1a;select * from testt…

[Linux] 007 目录处理命令

1. 目录处理命令&#xff1a;mkdir 命令名称&#xff1a;mkdir命令英文原意&#xff1a;make directories命令所在路径&#xff1a;/bin/mkdir执行权限&#xff1a;所有用户语法&#xff1a;mkdir -p [目录名]功能描述&#xff1a; 创建新目录-p 递归创建范例&#xff1a; mkdi…

计算机科学与技术专业《计算机网络原理》课程实验指导书,计算机科学导论,课程实验指导书解读.pdf...

计算机科学导论实验指导书聊城大学计算机学院聊城大学计算机学院聊城大学计算机学院聊城大学计算机学院2010 年年 8 月月年年 月月《计算机科学导论》课程实验指导书目 录《计算机科学导论》课程实验教学大纲 1实验一 计算机基本操作 3基本信息 3实验预习 3实验过程 4实验数据和…

Java Singleton设计模式

它是Java中最简单的设计模式之一。 如果有人问我哪种设计模式好&#xff0c;那么我会很自豪地说Singleton。 但是&#xff0c;当他们深入询问单身人士的概念时&#xff0c;我感到很困惑。 真的单身是那么困难吗&#xff1f; 确实不是&#xff0c;但是它有许多我们需要了解的…

elasticsearch配置文件解析

1.Cluster&#xff08;集群&#xff09;# 集群名称标识了你的集群&#xff0c;自动探查会用到它。默认值为elasticsearch# 如果你在同一个网络中运行多个集群&#xff0c;那就要确保你的集群名称是独一无二的。## cluster.name: my-application 2.Node&#xff08;节点&#xf…

刚刚出炉的Asp.net网站部署视频教程

刚刚出炉的Asp.net网站部署视频教程,希望对新手朋友有所帮助主要包括内容&#xff1a; 1、IIS的安装与配置 2、Asp.net环境的安装与常见问题解决 3、Asp.net网站的配置和使用 51aspx会陆续推出基础教程与大家见面&#xff0c;敬请期待&#xff01; 中间不妥之处还希望大家多多包…

添加jQuery方法解析url查询部分

Web前端不同页面间传值可以使用 cookies、localStorage 和 sessionStorage 等本地存储。 但是&#xff0c;今天我们尝试使用 url 查询&#xff0c;假设我们要传递字符串 str 到 modify.html 页面&#xff1a; var str "nameBob Chen&gender男&date1998/04/26&am…

计算机网络 实验教案,《计算机网络》实验教案.pdf

《计算机网络》实验教案《计算机网络》实验教案临沂师范学院信息学院1实验一 网线制作与以太网组网一、实验目的和要求使学生掌握RJ &#xff0d;45 头的制作。学会以太网组网。二、实验课时&#xff1a;2 课时。三、实验环境与工具RJ&#xff0d;45 头若干、双绞线若干米、RJ&…

Java 8可选:如何使用它

Java 8带有新的Optional类型&#xff0c;类似于其他语言中提供的类型。 这篇文章将介绍这种新类型的使用方式&#xff0c;即主要用途。 什么是可选类型&#xff1f; 可选的是新容器类型&#xff0c;如果有可用值&#xff0c;则该容器类型将包装单个值。 因此&#xff0c;其含义…

strip用法

Python strip() 方法用于移除字符串头尾指定的字符&#xff08;默认为空格或换行符&#xff09;或字符序列。 注意&#xff1a;该方法只能删除开头或是结尾的字符&#xff0c;不能删除中间部分的字符。 str "00000003210Runoob01230000000"; print str.strip( 0 ); …

为JAVA性能而设计(一)

为JAVA性能而设计&#xff08;一&#xff09; 发布时间&#xff1a;2007-1-9 15:51:42 来源&#xff1a;JavaWorld 作者&#xff1a;Brian Go…为JAVA性能而设计&#xff08;二&#xff09; 发布时间&#xff1a;2007-1-9 15:52:57 来源&#xff1a;JavaWorld 作…

ubuntu16 升级pip3后报错File /usr/bin/pip3, line 9, in module from pip import main ImportError: cannot...

问题&#xff1a;ubuntu16 执行pip3 install --upgrade pip之后&#xff0c;pip3执行出错。 Traceback (most recent call last): File "/usr/bin/pip3", line 9, in <module> from pip import mainImportError: cannot import name main 截图如下&#xff1a;…