contentEditable,window.getSelection详解---可编辑div,容器,设置/获取光标位置,光标处插入内容及光标的操作

本文详细介绍了HTML的contentEditable属性,用于使元素变为可编辑状态,常见于富文本编辑器。文章讨论了在不同浏览器中回车时生成标记的差异,并展示了如何通过document.execCommand命令改变新建段落的方式。此外,还探讨了window.getSelection()用于获取用户选择文本的方法,以及如何在可编辑区域进行光标操作,如插入文本、获取光标位置、移动光标和记录恢复光标位置。

这周碰到一个东西,contentEditable ,它是用来指定一个元素是否是可编辑的,这也是富文本编辑器实现的底层支持,网上关于这部分东西的资料比较少或者不全,所以我来整理下关于这个属性,和可编辑区域的一些操作吧,比如获取光标位置,设置光标,往可编辑区域光标处插入内容等等

HTML中的contentEditable的属性可以打开某些元素的可编辑状态.也许你没用过contentEditable属性.甚至从未听说过.contentEditable的作用相当神奇.可以让div或整个网页,以及span等等元素设置为可写。我们最常用的输入文本内容便是input与textarea,使用contentEditable属性后,可以在div,table,p,span,body,等等很多元素中输入内容.

设置一个容器为可编辑区域:设置contentEditable属性

<body>
	<p contentEditable style="border: 1px solid red;">grsd</p>
	<div  contentEditable style="border: 1px solid red;">rsdgsdg </div>
</body>

在这里插入图片描述

设置placeholder:
这个不像表单一样,给属性加上placeholder属性指定值就可以了,还需要配合特殊的样式:empty做设置

	<style type="text/css">
			.content:empty::before {
    
    
				content: attr(placeholder);
				font-size: 14px;
				color: #CCC;
				line-height: 21px;
				padding-top: 20px;
			}
			.content {
    
    
				border: 1px solid black;
			}
		</style>
	<body>
		<div contentEditable class="content" placeholder="请输入不少于150字"></div>
	</body>

在这里插入图片描述

回车时,在标记生成上的不同点

因为各个浏览器在标记生成上的不同,因此跨浏览器使用 contenteditable 一直以来都是痛点,例如一些看起来十分简单的事情,如: 当你按下Enter/Return键在可编辑区域中创建一个新的文本行时,不同主流浏览器对此有不同处理(Firefox 插入<br>、IE/Opera将使用<p>、 Chrome/Safari 将使用 <div>)幸运的是在现代浏览器中,这些不同都趋于一致了。截止到Firefox 60,火狐开始使用<div>元素来包裹新生成的文本行,以与Chrome, modern Opera, Edge, and Safari.的行为趋于一致
在这里插入图片描述

改变回车时插入的标签:
如果你想使用不同的方式创建新的段落,上面所有浏览器都支持document.execCommand方法,该方法提供的 defaultParagraphSeparator 命令能够让你以不同的方式创建新的段落例如, 使用 <p> 元素:

document.execCommand("defaultParagraphSeparator", false, "p");

现在在编辑器中按回车就变成p标签了
在这里插入图片描述


document.execCommand的强大:

上面只是document.execCommand的一个命令演示

当一个HTML文档切换到设计模式时,document暴露 execCommand 方法,该方法允许运行命令来操纵可编辑内容区域的元素。
大多数命令影响document的 selection(粗体,斜体等),当其他命令插入新元素(添加链接)或影响整行(缩进)。当使用contentEditable时,调用 execCommand() 将影响当前活动的可编辑元素

命令很多,这里就不列举出来,具体可以参考官方文档document.execCommand命令大全

基于document.execCommand的这些命令我们可以做一个小型的富文本编辑器:

<!doctype html>
<html>
	<head>
		<title>Rich Text Editor</title>
		<script type="text/javascript">
			var oDoc, sDefTxt;

			function initDoc() {
    
    
				oDoc = document.getElementById("textBox");
				sDefTxt = oDoc.innerHTML;
				if(document.compForm.switchMode.checked) {
    
    
					setDocMode(true);
				}
			}

			function formatDoc(sCmd, sValue) {
    
    
				if(validateMode()) {
    
    
					document.execCommand(sCmd, false, sValue);
					oDoc.focus();
				}
			}

			function validateMode() {
    
    
				if(!document.compForm.switchMode.checked) {
    
    
					return true;
				}
				alert("Uncheck \"Show HTML\".");
				oDoc.focus();
				return false;
			}

			function setDocMode(bToSource) {
    
    
				var oContent;
				if(bToSource) {
    
    
					oContent = document.createTextNode(oDoc.innerHTML);
					oDoc.innerHTML = "";
					var oPre = document.createElement("pre");
					oDoc.contentEditable = false;
					oPre.id = "sourceText";
					oPre.contentEditable = true;
					oPre.appendChild(oContent);
					oDoc.appendChild(oPre);
					document.execCommand("defaultParagraphSeparator", false, "div");
				} else {
    
    
					if(document.all) {
    
    
						oDoc.innerHTML = oDoc.innerText;
					} else {
    
    
						oContent = document.createRange();
						oContent.selectNodeContents(oDoc.firstChild);
						oDoc.innerHTML = oContent.toString();
					}
					oDoc.contentEditable = true;
				}
				oDoc.focus();
			}

			function printDoc() {
    
    
				if(!validateMode()) {
    
    
					return;
				}
				var oPrntWin = window.open("", "_blank", "width=450,height=470,left=400,top=100,menubar=yes,toolbar=no,location=no,scrollbars=yes");
				oPrntWin.document.open();
				oPrntWin.document.write("<!doctype html><html><head><title>Print<\/title><\/head><body οnlοad=\"print();\">" + oDoc.innerHTML + "<\/body><\/html>");
				oPrntWin.document.close();
			}
		</script>
		<style type="text/css">
			.intLink {
    
    
				cursor: pointer;
			}
			
			img.intLink {
    
    
				border: 0;
			}
			
			#toolBar1 select {
    
    
				font-size: 10px;
			}
			
			#textBox {
    
    
				width: 540px;
				height: 200px;
				border: 1px #000000 solid;
				padding: 12px;
				overflow: scroll;
			}
			
			#textBox #sourceText {
    
    
				padding: 0;
				margin: 0;
				min-width: 498px;
				min-height: 200px;
			}
			
			#editMode label {
    
    
				cursor: pointer;
			}
		</style>
	</head>

	<body onload="initDoc();">
		<form name="compForm" method="post" action="sample.php" onsubmit="if(validateMode()){this.myDoc.value=oDoc.innerHTML;return true;}return false;">
			<input type="hidden" name="myDoc">
			<div id="toolBar1">
				<select onchange="formatDoc('formatblock',this[this.selectedIndex].value);this.selectedIndex=0;">
一、LabelShop 先擎条码标签编辑软件(简体中文)核心定位:专业条码标签设计 + 打印管理软件,是先擘(Zenpert)条码打印机的官方配套编辑工具,适配 Windows 系统,面向制造、零售、物流、仓储等场景的标签标准化制作需求。核心功能可视化标签设计:支持文本、图形、一维条码(Code 128/39/EAN-13 等)、二维码(QR/ Data Matrix)排版,提供模板库、分块 / 对齐标记、页码等高级排版功能;动态数据与批量打印:绑定 Excel/CSV/ 数据库(MySQL/SQL Server 等),支持流水号递增、可变份数打印、即扫即打,适配多规格标签纸;兼容性与输出:原生适配 Zenpert 全系列打印机,兼容其他品牌条码 / 办公打印机;支持导出打印文件、脚本输出、非打印对象管理,保障跨设备格式一致;基础安全与纠错:支持条码校验、标签预览、打印参数保存,减少错印。二、Zenpert(先擘)相关软件与硬件说明核心定位:通常指先擘 Zenpert 条码打印机硬件及其配套驱动 / 打印工具包;配套软件包含 LabelShop、打印机驱动、批量打印插件(部分版本称 Zenpert 软件为驱动 + 简易打印工具的合集),非独立的第三方编辑软件。核心功能(软件层面)打印机驱动:实现 Windows 系统与 Zenpert 打印机的通讯,提供打印参数(分辨率、速度、浓度、介质类型)配置;简易打印工具:快速调用 LabelShop 模板、批量导入 Excel 数据、执行扫码触发打印,适配生产线 / 仓储的快速打标场景;硬件管理:支持固件升级、端口设置(USB / 网口 / 串口)、传感器校准、打印头维护提醒。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codingWeb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值