html前端contenteditable实现元素可编辑
1 前言
1.1 定义
contenteditable="true"
是 HTML 中的一个属性,用于指定元素是否可被用户直接编辑。这个属性可以赋值为 "true"
、"false"
或者省略(默认为 false
)。
1.2 适用的 HTML 标签
1.3 应用场景
常用于文本编辑器、表单增强等场景。
2 属性说明
true
:
- 元素内容可编辑。
- 可以通过键盘输入、鼠标操作、剪切板等方式修改内容。
false
:
- 元素内容不可编辑。
- 即使父级元素为可编辑状态,设置
false
的子元素仍不可编辑。
- 省略值:
- 如果省略该属性,元素内容不可编辑(等同于
contenteditable="false"
)。
3 事件支持
事件说明和触发方式
事件 |
说明 |
触发方式 |
input |
内容变化时触发(例如输入、删除内容)。 |
在可编辑区域输入或删除文本。 |
keydown |
键盘按下时触发。 |
按下键盘任意按键。 |
keyup |
键盘释放时触发。 |
松开按下的键盘按键。 |
focus |
元素获得焦点时触发。 |
点击元素或使用 Tab 键聚焦到元素。 |
blur |
元素失去焦点时触发。 |
点击页面其他位置或按 Tab 离开焦点。 |
paste |
用户粘贴内容时触发。 |
使用快捷键 Ctrl+V 或右键选择粘贴。 |
copy |
用户复制内容时触发。 |
使用快捷键 Ctrl+C 或右键选择复制。 |
cut |
用户剪切内容时触发。 |
使用快捷键 Ctrl+X 或右键选择剪切。 |
mousedown |
鼠标点击(按下)时触发。 |
按下鼠标左键、右键或中键。 |
mouseup |
鼠标释放(抬起)时触发。 |
松开鼠标左键、右键或中键。 |
mousemove |
鼠标在元素内移动时触发。 |
鼠标在可编辑区域内移动。 |
dragstart |
拖拽操作开始时触发。 |
选中文本并拖动开始拖拽。 |
drop |
放置拖拽的内容时触发。 |
将外部内容拖放到可编辑区域。 |
3.1 input 监听内容变化
<div id="edit_content" contenteditable="true"
style="width: 500px; height:60px;line-height: 30px; border: 1px solid #ccc; border-radius: 5px;outline: none; "
>
有勇氣的牛排contenteditable編輯屬性測試
</div>
<script>
const editContent = document.getElementById('edit_content');
editContent.addEventListener('input', () => {
console.log("=== 内容发生变化===")
console.log('原生html:', editContent.innerHTML);
console.log('原生文本:', editContent.innerText);
});
</script>


3.2 keydown 键盘 按下
捕获键盘操作
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>keydown 事件</title>
</head>
<body>
<div id="editable" contenteditable="true" style="border: 1px solid #ccc; padding: 10px; min-height: 50px;">
有勇氣的牛排輸入測試:
</div>
<p><strong>事件日志:</strong></p>
<ul id="log"></ul>
<script>
const editableDiv = document.getElementById('editable');
const logList = document.getElementById('log');
function logEvent(eventType, additionalInfo = '') {
const listItem = document.createElement('li');
listItem.textContent = `${eventType} ${additionalInfo}`.trim();
logList.appendChild(listItem);
}
editableDiv.addEventListener('keydown', (e) => {
logEvent('Keydown 事件', `按下键:${e.key}`);
});
function trimLog() {
if (logList.children.length > 20) {
logList.removeChild(logList.firstChild);
}
}
setInterval(trimLog, 500);
</script>
</body>
</html>

3.3 keyup 键盘松开
editableDiv.addEventListener('keyup', (e) => {
logEvent('Keyup 事件', `松开键:${e.key}`);
});

3.4 focus 获取焦点
editableDiv.addEventListener('focus', () => {
logEvent('Focus 事件', '元素获得焦点');
});

3.5 blur 失去焦点
editableDiv.addEventListener('blur', () => {
logEvent('Blur 事件', '元素失去焦点');
});

3.6 paste 粘贴
editableDiv.addEventListener('paste', (e) => {
logEvent('Paste 事件', '用户粘贴了内容');
});

3.7 copy 复制内容
editableDiv.addEventListener('copy', (event) => {
event.preventDefault();
const copiedText = window.getSelection().toString();
logEvent('Copy 事件', `复制的内容:${copiedText}`);
if (event.clipboardData) {
event.clipboardData.setData('text/plain', copiedText);
}
});

3.8 cut 剪切
editableDiv.addEventListener('cut', (event) => {
event.preventDefault();
const selectedText = window.getSelection().toString();
if (!selectedText) {
return;
}
const customText = `${selectedText}`;
if (event.clipboardData) {
event.clipboardData.setData('text/plain', customText);
}
const selection = window.getSelection();
if (selection.rangeCount > 0) {
const range = selection.getRangeAt(0);
range.deleteContents();
}
logEvent('Cut 事件', `剪切的内容:${customText}`);
});

3.9 mousedown 鼠标点击事件
editableDiv.addEventListener('mousedown', (e) => {
const buttonType = e.button === 0 ? '左键' : e.button === 1 ? '中键' : '右键';
const { clientX, clientY } = e;
const clickedContent = e.target.innerText.trim();
const selectedText = window.getSelection().toString();
logEvent('Mousedown 事件', `按钮:${buttonType}, 坐标:(${clientX}, ${clientY}), 内容:${clickedContent}, 选中文本:${selectedText || '无'}`);
});

3.10 mouseup 鼠标释放
editableDiv.addEventListener('mouseup', (e) => {
logEvent('Mouseup 事件', `鼠标释放,按钮:${e.button}`);
});
3.11 mousemove 鼠标移动
editableDiv.addEventListener('mousemove', () => {
logEvent('Mousemove 事件', '鼠标正在移动');
});
案例
let startX = null;
let startY = null;
editableDiv.addEventListener('mousemove', (e) => {
const {clientX, clientY} = e;
if (startX === null || startY === null) {
startX = clientX;
startY = clientY;
}
const distanceX = clientX - startX;
const distanceY = clientY - startY;
logEvent(
'Mousemove 事件',
`起点:(${startX}, ${startY}), 当前坐标:(${clientX}, ${clientY}), 移动距离:(${distanceX}, ${distanceY})`
);
});
editableDiv.addEventListener('mouseup', () => {
logEvent('Mouseup 事件', `结束坐标:(${startX}, ${startY})`);
startX = null;
startY = null;
});

3.12 dragstart 开始拖拽
editableDiv.addEventListener('dragstart', () => {
logEvent('Dragstart 事件', '拖拽开始');
});
3.13 监听 drop 事件(拖拽放置)
editableDiv.addEventListener('drop', () => {
logEvent('Drop 事件', '放置拖拽的内容');
});
<h1><a id="htmlcontenteditable_0"></a>html前端contenteditable实现元素可编辑</h1>
<h2><a id="1__2"></a>1 前言</h2>
<h3><a id="11__4"></a>1.1 定义</h3>
<p><code>contenteditable="true"</code> 是 HTML 中的一个属性,用于指定元素是否可被用户直接编辑。这个属性可以赋值为 <code>"true"</code>、<code>"false"</code> 或者省略(默认为 <code>false</code>)。</p>
<h3><a id="12__HTML__8"></a>1.2 适用的 HTML 标签</h3>
<ul>
<li><code><div></code></li>
<li><code><span></code></li>
<li><code><p></code></li>
<li><code><td></code></li>
</ul>
<h3><a id="13__15"></a>1.3 应用场景</h3>
<p>常用于文本编辑器、表单增强等场景。</p>
<h2><a id="2__19"></a>2 属性说明</h2>
<ol>
<li><strong><code>true</code></strong>:
<ul>
<li>元素内容可编辑。</li>
<li>可以通过键盘输入、鼠标操作、剪切板等方式修改内容。</li>
</ul>
</li>
<li><strong><code>false</code></strong>:
<ul>
<li>元素内容不可编辑。</li>
<li>即使父级元素为可编辑状态,设置 <code>false</code> 的子元素仍不可编辑。</li>
</ul>
</li>
<li><strong>省略值</strong>:
<ul>
<li>如果省略该属性,元素内容不可编辑(等同于 <code>contenteditable="false"</code>)。</li>
</ul>
</li>
</ol>
<h2><a id="3__30"></a>3 事件支持</h2>
<h3><a id="_32"></a><strong>事件说明和触发方式</strong></h3>
<table>
<thead>
<tr>
<th><strong>事件</strong></th>
<th><strong>说明</strong></th>
<th><strong>触发方式</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong><code>input</code></strong></td>
<td>内容变化时触发(例如输入、删除内容)。</td>
<td>在可编辑区域输入或删除文本。</td>
</tr>
<tr>
<td><strong><code>keydown</code></strong></td>
<td>键盘按下时触发。</td>
<td>按下键盘任意按键。</td>
</tr>
<tr>
<td><strong><code>keyup</code></strong></td>
<td>键盘释放时触发。</td>
<td>松开按下的键盘按键。</td>
</tr>
<tr>
<td><strong><code>focus</code></strong></td>
<td>元素获得焦点时触发。</td>
<td>点击元素或使用 <code>Tab</code> 键聚焦到元素。</td>
</tr>
<tr>
<td><strong><code>blur</code></strong></td>
<td>元素失去焦点时触发。</td>
<td>点击页面其他位置或按 <code>Tab</code> 离开焦点。</td>
</tr>
<tr>
<td><strong><code>paste</code></strong></td>
<td>用户粘贴内容时触发。</td>
<td>使用快捷键 <code>Ctrl+V</code> 或右键选择粘贴。</td>
</tr>
<tr>
<td><strong><code>copy</code></strong></td>
<td>用户复制内容时触发。</td>
<td>使用快捷键 <code>Ctrl+C</code> 或右键选择复制。</td>
</tr>
<tr>
<td><strong><code>cut</code></strong></td>
<td>用户剪切内容时触发。</td>
<td>使用快捷键 <code>Ctrl+X</code> 或右键选择剪切。</td>
</tr>
<tr>
<td><strong><code>mousedown</code></strong></td>
<td>鼠标点击(按下)时触发。</td>
<td>按下鼠标左键、右键或中键。</td>
</tr>
<tr>
<td><strong><code>mouseup</code></strong></td>
<td>鼠标释放(抬起)时触发。</td>
<td>松开鼠标左键、右键或中键。</td>
</tr>
<tr>
<td><strong><code>mousemove</code></strong></td>
<td>鼠标在元素内移动时触发。</td>
<td>鼠标在可编辑区域内移动。</td>
</tr>
<tr>
<td><strong><code>dragstart</code></strong></td>
<td>拖拽操作开始时触发。</td>
<td>选中文本并拖动开始拖拽。</td>
</tr>
<tr>
<td><strong><code>drop</code></strong></td>
<td>放置拖拽的内容时触发。</td>
<td>将外部内容拖放到可编辑区域。</td>
</tr>
</tbody>
</table>
<h3><a id="31_input__50"></a>3.1 input 监听内容变化</h3>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"edit_content"</span> <span class="hljs-attr">contenteditable</span>=<span class="hljs-string">"true"</span>
<span class="hljs-attr">style</span>=<span class="hljs-string">"width: 500px; height:60px;line-height: 30px; border: 1px solid #ccc; border-radius: 5px;outline: none; "</span>
></span>
有勇氣的牛排contenteditable編輯屬性測試
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="language-javascript">
<span class="hljs-keyword">const</span> editContent = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">'edit_content'</span>);
<span class="hljs-comment">// 1. 监听 `input` 事件</span>
editContent.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'input'</span>, <span class="hljs-function">() =></span> {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">"=== 内容发生变化==="</span>)
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'原生html:'</span>, editContent.<span class="hljs-property">innerHTML</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'原生文本:'</span>, editContent.<span class="hljs-property">innerText</span>);
});
</span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/20c954f820013df70b48895878420685.png" alt="image.png" /></p>
<p><img src="https://static.couragesteak.com/article/fbda373d19677b40a4fd66ed658f612f.png" alt="image.png" /></p>
<h3><a id="32_keydown___74"></a>3.2 keydown 键盘 按下</h3>
<p>捕获键盘操作</p>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-meta"><!DOCTYPE <span class="hljs-keyword">html</span>></span>
<span class="hljs-tag"><<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">head</span>></span>
<span class="hljs-tag"><<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">title</span>></span>keydown 事件<span class="hljs-tag"></<span class="hljs-name">title</span>></span>
<span class="hljs-tag"></<span class="hljs-name">head</span>></span>
<span class="hljs-tag"><<span class="hljs-name">body</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"editable"</span> <span class="hljs-attr">contenteditable</span>=<span class="hljs-string">"true"</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"border: 1px solid #ccc; padding: 10px; min-height: 50px;"</span>></span>
有勇氣的牛排輸入測試:
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span><span class="hljs-tag"><<span class="hljs-name">strong</span>></span>事件日志:<span class="hljs-tag"></<span class="hljs-name">strong</span>></span><span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">ul</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"log"</span>></span><span class="hljs-tag"></<span class="hljs-name">ul</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="language-javascript">
<span class="hljs-comment">// 获取元素和日志显示区域</span>
<span class="hljs-keyword">const</span> editableDiv = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">'editable'</span>);
<span class="hljs-keyword">const</span> logList = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">'log'</span>);
<span class="hljs-comment">// 工具函数:记录事件日志</span>
<span class="hljs-keyword">function</span> <span class="hljs-title function_">logEvent</span>(<span class="hljs-params">eventType, additionalInfo = <span class="hljs-string">''</span></span>) {
<span class="hljs-keyword">const</span> listItem = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">'li'</span>);
listItem.<span class="hljs-property">textContent</span> = <span class="hljs-string">`<span class="hljs-subst">${eventType}</span> <span class="hljs-subst">${additionalInfo}</span>`</span>.<span class="hljs-title function_">trim</span>();
logList.<span class="hljs-title function_">appendChild</span>(listItem);
}
<span class="hljs-comment">// 2. 监听 `keydown` 事件</span>
editableDiv.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'keydown'</span>, <span class="hljs-function">(<span class="hljs-params">e</span>) =></span> {
<span class="hljs-title function_">logEvent</span>(<span class="hljs-string">'Keydown 事件'</span>, <span class="hljs-string">`按下键:<span class="hljs-subst">${e.key}</span>`</span>);
});
<span class="hljs-comment">// 限制日志长度,防止过多</span>
<span class="hljs-keyword">function</span> <span class="hljs-title function_">trimLog</span>(<span class="hljs-params"></span>) {
<span class="hljs-keyword">if</span> (logList.<span class="hljs-property">children</span>.<span class="hljs-property">length</span> > <span class="hljs-number">20</span>) {
logList.<span class="hljs-title function_">removeChild</span>(logList.<span class="hljs-property">firstChild</span>);
}
}
<span class="hljs-built_in">setInterval</span>(trimLog, <span class="hljs-number">500</span>);
</span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"></<span class="hljs-name">body</span>></span>
<span class="hljs-tag"></<span class="hljs-name">html</span>></span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/98d1dc80a9d7cbe979a90db096ba0a2d.png" alt="image.png" /></p>
<h3><a id="33_keyup__127"></a>3.3 keyup 键盘松开</h3>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-comment">// 3. 监听 keyup 事件</span>
editableDiv.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'keyup'</span>, <span class="hljs-function">(<span class="hljs-params">e</span>) =></span> {
<span class="hljs-title function_">logEvent</span>(<span class="hljs-string">'Keyup 事件'</span>, <span class="hljs-string">`松开键:<span class="hljs-subst">${e.key}</span>`</span>);
});
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/f59f5dd1db0c8addc00a0aa93d9b816b.png" alt="image.png" /></p>
<h3><a id="34_focus__138"></a>3.4 focus 获取焦点</h3>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-comment">// 4. 监听 `focus` 事件</span>
editableDiv.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'focus'</span>, <span class="hljs-function">() =></span> {
<span class="hljs-title function_">logEvent</span>(<span class="hljs-string">'Focus 事件'</span>, <span class="hljs-string">'元素获得焦点'</span>);
});
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/cbcf30353b20ad41639d97971b6f0d8b.png" alt="image20241126113639165.png" /></p>
<h3><a id="35_blur__149"></a>3.5 blur 失去焦点</h3>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-comment">// 5. 监听 `blur` 事件</span>
editableDiv.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'blur'</span>, <span class="hljs-function">() =></span> {
<span class="hljs-title function_">logEvent</span>(<span class="hljs-string">'Blur 事件'</span>, <span class="hljs-string">'元素失去焦点'</span>);
});
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/df2f9be15c9a0ccd030c94a483bb89f8.png" alt="image.png" /></p>
<h3><a id="36_paste__160"></a>3.6 paste 粘贴</h3>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-comment">// 6. 监听 paste 事件(粘贴内容)</span>
editableDiv.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'paste'</span>, <span class="hljs-function">(<span class="hljs-params">e</span>) =></span> {
<span class="hljs-title function_">logEvent</span>(<span class="hljs-string">'Paste 事件'</span>, <span class="hljs-string">'用户粘贴了内容'</span>);
});
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/3fe289019adcf896cd50d7d8bde11600.png" alt="image.png" /></p>
<h3><a id="37_copy__171"></a>3.7 copy 复制内容</h3>
<pre><div class="hljs"><code class="lang-javascript">editableDiv.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'copy'</span>, <span class="hljs-function">(<span class="hljs-params">event</span>) =></span> {
<span class="hljs-comment">// 阻止默认行为以确保自定义逻辑可以生效</span>
event.<span class="hljs-title function_">preventDefault</span>();
<span class="hljs-comment">// 获取复制的内容</span>
<span class="hljs-keyword">const</span> copiedText = <span class="hljs-variable language_">window</span>.<span class="hljs-title function_">getSelection</span>().<span class="hljs-title function_">toString</span>(); <span class="hljs-comment">// 用户选中的文本</span>
<span class="hljs-title function_">logEvent</span>(<span class="hljs-string">'Copy 事件'</span>, <span class="hljs-string">`复制的内容:<span class="hljs-subst">${copiedText}</span>`</span>);
<span class="hljs-comment">// 可选:将内容写入剪贴板</span>
<span class="hljs-keyword">if</span> (event.<span class="hljs-property">clipboardData</span>) {
event.<span class="hljs-property">clipboardData</span>.<span class="hljs-title function_">setData</span>(<span class="hljs-string">'text/plain'</span>, copiedText);
}
});
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/909c7ffe9abd3b1fb8f3017ed4bcc388.png" alt="image.png" /></p>
<h3><a id="38_cut__191"></a>3.8 cut 剪切</h3>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-comment">// 8. 监听 `cut` 事件(剪切内容)</span>
editableDiv.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'cut'</span>, <span class="hljs-function">(<span class="hljs-params">event</span>) =></span> {
<span class="hljs-comment">// 阻止默认剪切行为</span>
event.<span class="hljs-title function_">preventDefault</span>();
<span class="hljs-comment">// 获取用户选中的内容</span>
<span class="hljs-keyword">const</span> selectedText = <span class="hljs-variable language_">window</span>.<span class="hljs-title function_">getSelection</span>().<span class="hljs-title function_">toString</span>();
<span class="hljs-comment">// 如果没有选中内容,则直接返回</span>
<span class="hljs-keyword">if</span> (!selectedText) {
<span class="hljs-keyword">return</span>;
}
<span class="hljs-comment">// 自定义剪切内容(示例:添加前缀)</span>
<span class="hljs-keyword">const</span> customText = <span class="hljs-string">`<span class="hljs-subst">${selectedText}</span>`</span>;
<span class="hljs-comment">// 将内容写入剪贴板</span>
<span class="hljs-keyword">if</span> (event.<span class="hljs-property">clipboardData</span>) {
event.<span class="hljs-property">clipboardData</span>.<span class="hljs-title function_">setData</span>(<span class="hljs-string">'text/plain'</span>, customText);
}
<span class="hljs-comment">// 删除选中的内容</span>
<span class="hljs-keyword">const</span> selection = <span class="hljs-variable language_">window</span>.<span class="hljs-title function_">getSelection</span>();
<span class="hljs-keyword">if</span> (selection.<span class="hljs-property">rangeCount</span> > <span class="hljs-number">0</span>) {
<span class="hljs-keyword">const</span> range = selection.<span class="hljs-title function_">getRangeAt</span>(<span class="hljs-number">0</span>); <span class="hljs-comment">// 获取选区范围</span>
range.<span class="hljs-title function_">deleteContents</span>(); <span class="hljs-comment">// 从 DOM 中移除选区内容</span>
}
<span class="hljs-comment">// 记录日志</span>
<span class="hljs-title function_">logEvent</span>(<span class="hljs-string">'Cut 事件'</span>, <span class="hljs-string">`剪切的内容:<span class="hljs-subst">${customText}</span>`</span>);
});
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/8f0067171db6bb5e5b43e3376c32b70e.png" alt="image.png" /></p>
<h3><a id="39_mousedown__230"></a>3.9 mousedown 鼠标点击事件</h3>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-comment">// 监听 mousedown 事件</span>
editableDiv.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'mousedown'</span>, <span class="hljs-function">(<span class="hljs-params">e</span>) =></span> {
<span class="hljs-keyword">const</span> buttonType = e.<span class="hljs-property">button</span> === <span class="hljs-number">0</span> ? <span class="hljs-string">'左键'</span> : e.<span class="hljs-property">button</span> === <span class="hljs-number">1</span> ? <span class="hljs-string">'中键'</span> : <span class="hljs-string">'右键'</span>;
<span class="hljs-keyword">const</span> { clientX, clientY } = e; <span class="hljs-comment">// 点击的坐标</span>
<span class="hljs-keyword">const</span> clickedContent = e.<span class="hljs-property">target</span>.<span class="hljs-property">innerText</span>.<span class="hljs-title function_">trim</span>(); <span class="hljs-comment">// 点击时的内容</span>
<span class="hljs-keyword">const</span> selectedText = <span class="hljs-variable language_">window</span>.<span class="hljs-title function_">getSelection</span>().<span class="hljs-title function_">toString</span>(); <span class="hljs-comment">// 当前选中的文本</span>
<span class="hljs-comment">// 记录事件信息</span>
<span class="hljs-title function_">logEvent</span>(<span class="hljs-string">'Mousedown 事件'</span>, <span class="hljs-string">`按钮:<span class="hljs-subst">${buttonType}</span>, 坐标:(<span class="hljs-subst">${clientX}</span>, <span class="hljs-subst">${clientY}</span>), 内容:<span class="hljs-subst">${clickedContent}</span>, 选中文本:<span class="hljs-subst">${selectedText || <span class="hljs-string">'无'</span>}</span>`</span>);
});
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/89a174ef4bd211e80729708de77f1240.png" alt="image.png" /></p>
<h3><a id="310_mouseup__247"></a>3.10 mouseup 鼠标释放</h3>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-comment">// 10. 监听 mouseup 事件(鼠标释放)</span>
editableDiv.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'mouseup'</span>, <span class="hljs-function">(<span class="hljs-params">e</span>) =></span> {
<span class="hljs-title function_">logEvent</span>(<span class="hljs-string">'Mouseup 事件'</span>, <span class="hljs-string">`鼠标释放,按钮:<span class="hljs-subst">${e.button}</span>`</span>);
});
</code></div></pre>
<h3><a id="311_mousemove__256"></a>3.11 mousemove 鼠标移动</h3>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-comment">// 11. 监听 mousemove 事件(鼠标移动)</span>
editableDiv.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'mousemove'</span>, <span class="hljs-function">() =></span> {
<span class="hljs-title function_">logEvent</span>(<span class="hljs-string">'Mousemove 事件'</span>, <span class="hljs-string">'鼠标正在移动'</span>);
});
</code></div></pre>
<p>案例</p>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-comment">// 监听 mousemove 事件</span>
<span class="hljs-keyword">let</span> startX = <span class="hljs-literal">null</span>; <span class="hljs-comment">// 起点 X 坐标</span>
<span class="hljs-keyword">let</span> startY = <span class="hljs-literal">null</span>; <span class="hljs-comment">// 起点 Y 坐标</span>
editableDiv.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'mousemove'</span>, <span class="hljs-function">(<span class="hljs-params">e</span>) =></span> {
<span class="hljs-keyword">const</span> {clientX, clientY} = e; <span class="hljs-comment">// 当前坐标</span>
<span class="hljs-keyword">if</span> (startX === <span class="hljs-literal">null</span> || startY === <span class="hljs-literal">null</span>) {
startX = clientX;
startY = clientY; <span class="hljs-comment">// 初始化起点</span>
}
<span class="hljs-keyword">const</span> distanceX = clientX - startX; <span class="hljs-comment">// X 方向移动距离</span>
<span class="hljs-keyword">const</span> distanceY = clientY - startY; <span class="hljs-comment">// Y 方向移动距离</span>
<span class="hljs-title function_">logEvent</span>(
<span class="hljs-string">'Mousemove 事件'</span>,
<span class="hljs-string">`起点:(<span class="hljs-subst">${startX}</span>, <span class="hljs-subst">${startY}</span>), 当前坐标:(<span class="hljs-subst">${clientX}</span>, <span class="hljs-subst">${clientY}</span>), 移动距离:(<span class="hljs-subst">${distanceX}</span>, <span class="hljs-subst">${distanceY}</span>)`</span>
);
});
<span class="hljs-comment">// 监听 mouseup 事件,重置起点坐标</span>
editableDiv.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'mouseup'</span>, <span class="hljs-function">() =></span> {
<span class="hljs-title function_">logEvent</span>(<span class="hljs-string">'Mouseup 事件'</span>, <span class="hljs-string">`结束坐标:(<span class="hljs-subst">${startX}</span>, <span class="hljs-subst">${startY}</span>)`</span>);
startX = <span class="hljs-literal">null</span>;
startY = <span class="hljs-literal">null</span>;
});
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/eef91bb105dab543e49a0317f1a40744.png" alt="image.png" /></p>
<h3><a id="312__dragstart__296"></a>3.12 dragstart 开始拖拽</h3>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-comment">// 12. 监听 `dragstart` 事件(开始拖拽)</span>
editableDiv.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'dragstart'</span>, <span class="hljs-function">() =></span> {
<span class="hljs-title function_">logEvent</span>(<span class="hljs-string">'Dragstart 事件'</span>, <span class="hljs-string">'拖拽开始'</span>);
});
</code></div></pre>
<h3><a id="313__drop__305"></a>3.13 监听 drop 事件(拖拽放置)</h3>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-comment">// 13. 监听 `drop` 事件(拖拽放置)</span>
editableDiv.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'drop'</span>, <span class="hljs-function">() =></span> {
<span class="hljs-title function_">logEvent</span>(<span class="hljs-string">'Drop 事件'</span>, <span class="hljs-string">'放置拖拽的内容'</span>);
});
</code></div></pre>
留言