You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript复制innerHTML且不保留HTML转义字符

问题:复制HTML代码时保留原始标签而非转义字符

我编写了两个JavaScript函数:

  • outputCode:动态向id为code-output的div中填充示例HTML代码(当前为静态内容,后续计划让style和body动态生成)
  • copyHtml:将示例HTML代码复制到剪贴板

但copyHtml复制的内容包含HTML转义字符(如&amp;lthtml&amp;gt),我需要复制的是原始的HTML标签(如<html>)。

原始函数代码

outputCode函数

function outputCode() {
    var style = "&lt;p&gt;#main-container {&lt;/p&gt;&lt;p class='indent-1'&gt;width: 100%;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;"

    var body = "&lt;p&gt;&amp;ltdiv id='main-container'&amp;gt&lt;/p&gt;" + "&lt;p class='indent-1'&gt;&amp;ltdiv id='header'&amp;gt&lt;/p&gt;" + "&lt;p class='indent-2'&gt;&amp;lth1&amp;gtThis is a header 1&amp;lt/h1&amp;gt&lt;/p&gt;" + "&lt;p class='indent-1'&gt;&amp;lt/div&amp;gt&lt;/p&gt;" + "&lt;p&gt;&amp;lt/div&amp;gt&lt;/p&gt;"

    code = "&lt;p&gt;&amp;lt!DOCTYPE html&amp;gt&lt;/p&gt;" + "&lt;p&gt;&amp;lthtml&amp;gt&lt;/p&gt;" + "&lt;p class='indent-1'&gt;&amp;lthead&amp;gt&lt;/p&gt;" + "&lt;p class='indent-2'&gt;&amp;ltmeta charset='utf-8'&amp;gt&lt;/p&gt;" + "&lt;p class='indent-2'&gt;&amp;ltmeta name='viewport' content='width=device-width, initial-scale=1'&amp;gt&lt;/p&gt;" + "&lt;p class='indent-2'&gt;&amp;lttitle&amp;gtMy HTML Theme&amp;lt/title&amp;gt&lt;/p&gt;" + "&lt;p class='indent-2'&gt;&amp;ltstyle&amp;gt&lt;/p&gt;" + "&lt;div class='code'&gt;" + style + "&lt;/div&gt;" + "&lt;p class='indent-2'&gt;&amp;lt/style&amp;gt&lt;/p&gt;" + "&lt;p class='indent-1'&gt;&amp;lt/head&amp;gt&lt;/p&gt;" + "&lt;p class='indent-1'&gt;&amp;ltbody&amp;gt&lt;/p&gt;" + "&lt;div class='code'&gt;" + body + "&lt;/div&gt;" + "&lt;p class='indent-1'&gt;&amp;lt/body&amp;gt&lt;/p&gt;" + "&lt;p&gt;&amp;lt/html&amp;gt&lt;/p&gt;"

    outputBlock = document.getElementById("code-output");

    outputBlock.innerHTML = code;
}

copyHtml函数

function copyHtml() {
    var copyText = document.getElementById("code-output").innerHTML;

    navigator.clipboard.writeText(copyText);

    document.getElementById("copied-message").innerHTML = "Copied";
}

解决方案

方案一:通过临时DOM元素还原转义内容

核心思路是利用浏览器的DOM解析能力,把转义后的HTML还原成原始文本:

function copyHtml() {
    // 获取转义后的HTML内容
    var escapedHtml = document.getElementById("code-output").innerHTML;
    // 创建临时div元素
    var tempDiv = document.createElement("div");
    // 将转义内容设置为临时div的innerHTML,浏览器会自动解析转义字符
    tempDiv.innerHTML = escapedHtml;
    // 获取还原后的纯文本(即原始HTML标签)
    var originalHtml = tempDiv.textContent;
    
    navigator.clipboard.writeText(originalHtml);
    document.getElementById("copied-message").innerHTML = "Copied";
}

原理:当把包含&amp;lt;这类转义序列的内容设置给DOM元素的innerHTML时,浏览器会自动将其解析为对应的原始字符(如<),再通过textContent就能拿到不带转义的纯文本内容。


方案二:提前存储原始HTML代码(推荐)

如果后续要动态生成style和body,更可靠的方式是在outputCode中同步保存一份原始的HTML代码,复制时直接使用这份内容,避免依赖DOM解析:

function outputCode() {
    // 生成用于显示的转义内容(保留原逻辑)
    var style = "&lt;p&gt;#main-container {&lt;/p&gt;&lt;p class='indent-1'&gt;width: 100%;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;"
    var body = "&lt;p&gt;&amp;ltdiv id='main-container'&amp;gt&lt;/p&gt;" + "&lt;p class='indent-1'&gt;&amp;ltdiv id='header'&amp;gt&lt;/p&gt;" + "&lt;p class='indent-2'&gt;&amp;lth1&amp;gtThis is a header 1&amp;lt/h1&amp;gt&lt;/p&gt;" + "&lt;p class='indent-1'&gt;&amp;lt/div&amp;gt&lt;/p&gt;" + "&lt;p&gt;&amp;lt/div&amp;gt&lt;/p&gt;"
    var displayCode = "&lt;p&gt;&amp;lt!DOCTYPE html&amp;gt&lt;/p&gt;" + "&lt;p&gt;&amp;lthtml&amp;gt&lt;/p&gt;" + "&lt;p class='indent-1'&gt;&amp;lthead&amp;gt&lt;/p&gt;" + "&lt;p class='indent-2'&gt;&amp;ltmeta charset='utf-8'&amp;gt&lt;/p&gt;" + "&lt;p class='indent-2'&gt;&amp;ltmeta name='viewport' content='width=device-width, initial-scale=1'&amp;gt&lt;/p&gt;" + "&lt;p class='indent-2'&gt;&amp;lttitle&amp;gtMy HTML Theme&amp;lt/title&amp;gt&lt;/p&gt;" + "&lt;p class='indent-2'&gt;&amp;ltstyle&amp;gt&lt;/p&gt;" + "&lt;div class='code'&gt;" + style + "&lt;/div&gt;" + "&lt;p class='indent-2'&gt;&amp;lt/style&amp;gt&lt;/p&gt;" + "&lt;p class='indent-1'&gt;&amp;lt/head&amp;gt&lt;/p&gt;" + "&lt;p class='indent-1'&gt;&amp;ltbody&amp;gt&lt;/p&gt;" + "&lt;div class='code'&gt;" + body + "&lt;/div&gt;" + "&lt;p class='indent-1'&gt;&amp;lt/body&amp;gt&lt;/p&gt;" + "&lt;p&gt;&amp;lt/html&amp;gt&lt;/p&gt;"

    // 保存原始HTML代码(不带转义,后续动态生成时同步更新)
    window.originalHtmlCode = `<!DOCTYPE html>
<html>
    <head>
        <meta charset='utf-8'>
        <meta name='viewport' content='width=device-width, initial-scale=1'>
        <title>My HTML Theme</title>
        <style>
#main-container {
    width: 100%;
}
        </style>
    </head>
    <body>
<div id='main-container'>
    <div id='header'>
        <h1>This is a header 1</h1>
    </div>
</div>
    </body>
</html>`;

    var outputBlock = document.getElementById("code-output");
    outputBlock.innerHTML = displayCode;
}

// 修改后的复制函数
function copyHtml() {
    navigator.clipboard.writeText(window.originalHtmlCode);
    document.getElementById("copied-message").innerHTML = "Copied";
}

这种方式的优势在于:后续动态生成style和body时,只需要同步更新window.originalHtmlCode变量即可,复制的内容始终是最准确的原始代码,不会出现DOM解析可能带来的格式偏差。


内容的提问来源于stack exchange,提问作者Ben Kisow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 14:51:24