contenteditable 插入及粘贴纯文本内容
本文主要介绍 div 标签设置 contenteditable = ' true ' 时,在光标位置插入输入的内容,或在光标位置粘贴纯文本内容。文中涉及知识,可参考以下: http://www.zhangxinxu.com/wordpress/2016/01/contenteditable-plaintext-only/
http://www.jb51.net/article/57650.htm
https://www.cnblogs.com/rainman/archive/2011/02/27/1966482.html
http://www.zhangxinxu.com/wordpress/2011/04/js-range-html%E6%96%87%E6%A1%A3%E6%96%87%E5%AD%97%E5%86%85%E5%AE%B9%E9%80%89%E4%B8%AD%E3%80%81%E5%BA%93%E5%8F%8A%E5%BA%94%E7%94%A8%E4%BB%8B%E7%BB%8D/
http://kjah.iteye.com/blog/422509
先搭好 html ,一个按钮用于插入操作,一个 div 实现 contenteditable 功能,及主要逻辑
<button type="button" id='insert'>插入标题</button>
<div contentEditable="true" id="editor">
<h3>副标题</h3>
<p>文本</p>
</div>
接着是实现 js 逻辑功能
document.getElementById('insert').onclick=function(){
// 点击插入按钮时,系统弹框输入内容
var content = prompt('请输入内容');
// 防止编辑框没有获取焦点时点击,故加一个操作,使编辑框获取焦点
document.getElementById('editor').focus();
// 执行插入方法
if(!!content){
insertHtml('<h4>'+content+'</h4>');
}
}
主要逻辑在 insertHtml 方法中
function insertHtml(html) {
//Selection 对象,表示用户选择的文本范围或光标的当前位置。
//在非IE浏览器(Firefox、Safari、Chrome、Opera)下可以使用window.getSelection()获得selection对象
//anchor 选中区域的“起点”。
//focus 选中区域的“结束点”。
//range 是一种fragment(HTML片断),它包含了节点或文本节点的一部分。一般情况下,同一时刻页面中只可能有一个range,也有可能是多个range(使用Ctrl健进行多选,不过有的浏览器不允许,例如Chrome)。可以从selection中获得range对象,也可以使用document.createRange()方法获得。
var sel = window.getSelection(),
range;
if (sel.getRangeAt && sel.rangeCount) {
//getRangeAt(index) 从当前selection对象中获得一个range对象。
range = sel.getRangeAt(0);
//deleteContents()方法,range内容会被删除
range.deleteContents();
//将输入的内容写入并加载到 dom 中
var el = document.createElement("div");
el.innerHTML = html;
var frag = document.createDocumentFragment(), node, lastNode;
while ( (node = el.firstChild) ) {
lastNode = frag.appendChild(node);
}
//insertNode,在range的开始位置插入一 个节点
range.insertNode(frag);
//收尾
if (lastNode) {
range = range.cloneRange();
range.setStartAfter(lastNode);
range.collapse(true);
sel.removeAllRanges();
sel.addRange(range);
}
}
}
此时往编辑框里粘贴内容,会带上原本样式,显然不是我们要的结果,需对粘贴文本进行更改
document.getElementById('editor').onpaste=function(event){
var e = event || window.event
// 阻止默认粘贴
e.preventDefault();
// 粘贴事件有一个clipboardData的属性,提供了对剪贴板的访问
// clipboardData的getData(fomat) 从剪贴板获取指定格式的数据
var text = (e.originalEvent || e).clipboardData.getData('text/plain') || prompt('在这里输入文本');
// 插入
document.execCommand("insertText", false, text);
};
最后附上完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>contenteditable</title>
<style>
#insert{
width: 90px;
height: 30px;
border: 1px solid #ccc;
background-color: #fff;
margin: 10px;
}
#editor{
padding: 10px;
overflow-y: auto;
min-height:200px;
border:1px solid #f33;
outline: 0;
}
#editor h4{
margin: 10px 0;
}
</style>
</head>
<body> <button type="button" id='insert'>插入标题</button>
<div contentEditable="true" id="editor">
<h3>副标题</h3>
<p>文本</p>
</div> </body>
<script> document.getElementById('insert').onclick=function(){
var content = prompt('请输入内容');
document.getElementById('editor').focus();
if(!!content){
insertHtml('<h4>'+content+'</h4>');
}
} document.getElementById('editor').onpaste=function(event){
var e = event || window.event
e.preventDefault();
var text = (e.originalEvent || e).clipboardData.getData('text/plain') || prompt('在这里输入文本'); document.execCommand("insertText", false, text);
}; function insertHtml(html) {
var sel = window.getSelection(),
range; if (sel.getRangeAt && sel.rangeCount) {
range = sel.getRangeAt(0);
range.deleteContents();
var el = document.createElement("div");
el.innerHTML = html;
var frag = document.createDocumentFragment(), node, lastNode;
while ( (node = el.firstChild) ) {
lastNode = frag.appendChild(node);
}
range.insertNode(frag);
if (lastNode) {
range = range.cloneRange();
range.setStartAfter(lastNode);
range.collapse(true);
sel.removeAllRanges();
sel.addRange(range);
}
}
}
</script>
</html>
contenteditable 插入及粘贴纯文本内容的更多相关文章
- 小tip: 如何让contenteditable元素只能输入纯文本
div模拟textarea文本域轻松实现高度自适应 这篇文章发布于 2010年12月23日,星期四,22:07,归类于 css相关. 阅读 112630 次, 今日 40 次 by zhangxinx ...
- 如何让contenteditable元素只能输入纯文本
本文出自张旭鑫博客,要知详情,请戳右侧地址:http://www.zhangxinxu.com/wordpress/?p=5120 一.温故而知新 很多年以前,稍等,让我搜一下contentedita ...
- 转换 Html 内容为纯文本内容(html,文本互转)
转自http://www.cnblogs.com/jyshi/archive/2011/08/09/2132762.html : /// <summary> /// 转换纯文本内容为 HT ...
- 【ASP.NET Core】从向 Web API 提交纯文本内容谈起
前些时日,老周在升级“华南闲肾回收登记平台”时,为了扩展业务,尤其是允许其他开发人员在其他平台向本系统提交有关肾的介绍资料,于是就为该系统增加了几个 Web API. 其中,有关肾的介绍采用纯文本方式 ...
- Aspose.words Java基于模板生成word之纯文本内容
一,创建word模板 1.新建一个word文档 2.分别给四个参数设置域 (1)将鼠标置于想要设置域的地方 (2)设置域名 (3)设置好之后如下图所示 二,项目 1,引入maven依赖 <dep ...
- richtextbox Ctrl+V只粘贴纯文本格式
只能粘贴剪切板中的TXT内容 并且 不能改变 剪切板的内容1 当用户按下Ctrl+V屏蔽系统的粘贴功能,然后添加自己的功能2019年12月19日 19:34:38 private void richT ...
- DIV仿textarea文本域,contenteditable如何只能输入纯文本
对于支持HTML5浏览器有2种方法: 1. HTML5 <div contenteditable="plaintext-only"></div> 2. C ...
- 限制可编辑div只能输入纯文本
本博客转载自张鑫旭大神的一篇文章:小tip: 如何让contenteditable元素只能输入纯文本,原文地址:http://www.zhangxinxu.com/wordpress/2016/01/ ...
- EditText添加了ImageSpan后,在两者中间不能输入纯文本
严格来说是连续插入两个ImageSpan之后,在其中间不能够输入纯文本内容. 最后发现问题出现在了SpannableString在设置ImageSpan的时候第四个参数flag的问题. spannab ...
随机推荐
- JS实现键盘监听
不说废话直接上正文: <html> <head> <meta http-equiv="Content-Type" content="text ...
- 求逆序对[树状数组] jdoj
求逆序对 题目大意:给你一个序列,求逆序对个数. 注释:n<=$10^5$. 此题显然可以跑暴力.想枚举1到n,再求在i的后缀中有多少比i小的,统计答案即可.这显然是$n^2$的.这...显然过 ...
- 微信公众平台开发,模板消息,网页授权,微信JS-SDK,二维码生成(4)
微信公众平台开发,模板消息,什么是模板消息,模板消息接口指的是向用户发送重要的服务通知,只能用于符合场景的要求中去,如信用卡刷卡通知,购物成功通知等等.不支持广告营销,打扰用户的消息,模板消息类有固定 ...
- C#/AutoCAD 2018/ObjectArx/二次开发添加图形对象步骤和添加直线的例子(三)
1.创建一个图形对象的步骤如下(1)得到创建对象的图形数据库:(2)在内存中创建实体类的一个对象:(3)定义一个指向当前数据库的事务处理:(4)打开图形数据库的块表:(5)打开一个存储实体的块表记录( ...
- JavaScript简史
JavaScript诞生于1995年. 当时的web正在日益兴起,人们对客户端语言的需求也越来越强烈.当时走在技术革新最前沿的Netscape公司决定开发一种客户端语言,用来处理简单的输入验证. 当时 ...
- 上海依图-电话面试-angularjs
树的遍历(树结构:node.name,node.children),输出node.name(递归) 指令的scope的绑定策略(@绑定DOM数学单向绑定:=双向数据绑定:&绑定父作用域函数) ...
- jquery实现对div的拖拽功能
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- restful架构风格设计准则(六)版本管理
读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! 版本管理 在前面已经提到过,一个REST系统为资源所抽象出的URI实际上 ...
- Scala入门(1)Linux下Scala(2.12.1)安装
Scala入门(1)Linux下Scala(2.12.1)安装 一.文件准备 1.1 文件名称 scala-2.12.1.tgz 1.2 下载地址 http://www.scala-lang.org/ ...
- [机器学习Lesson3] 梯度下降算法
1. Gradient Descent(梯度下降) 梯度下降算法是很常用的算法,可以将代价函数J最小化.它不仅被用在线性回归上,也被广泛应用于机器学习领域中的众多领域. 1.1 线性回归问题应用 我们 ...