DOMParser 与模板和innerHTML 相比的优点

2024-01-11

我正在寻找处理解析 HTML 或 XHTML(XML 序列化)标记并将其插入网页 DOM 的最佳方法,该网页可以是 text/html 或 application/xhtml+xml。不打算使用像 jQuery 这样的库,并且只关心与最新版本 Chrome 的兼容性。

我看到两种可能的解决方案。

  • 模板和innerHTML:

    let temp = document.createElement('template');
    temp.innerHTML = markuptext;
    document.body.appendChild(temp.content);
    
  • DOM解析器:

    let parser = new DOMParser();
    let doc = parser.parseFromString('<div xmlns="http://www.w3.org/1999/xhtml">' + markuptext + '</div>', 'application/xhtml+xml');
    let frag = document.createDocumentFragment(), childNode;
    while (childNode = doc.documentElement.firstChild) {
        frag.appendChild(childNode);
    }
    document.body.appendChild(frag);
    

我希望有人能指出这两种方法的优点/缺点。

对于 Template & insideHTML,我假设 Chrome 会根据页面的内容类型选择解析为 HTML/XML,并且可能无法更改它。看来模板和innerHTML允许像这样的片段<tr><td></td></tr>之外的<tbody>无论它是解析为 HTML 还是 XML。 DOMParser 也允许这样做,但是only如果它解析为 XML。


这取决于你的目标是什么。如果您只想“按原样”附加已解析的 html/xhtml,则使用 .innerHTML,它更容易而且通常更快。 然而,根据我的经验,通常,你必须进行某种转换,那么使用 dom 操作是最好的方法。但是你应该避免在循环中逐个节点附加到 document.body ,因为它很慢而且效率低下,只需创建一些“虚拟”dom 元素,在循环中向其添加节点,然后附加整个对象:

let div = document.createElement('div');
let childNode;
while (childNode = doc.documentElement.firstChild) {
    div.appendChild(childNode);
}
document.body.appendChild(div);

一个重要的注意事项是关于尝试在 JS 中找到最有效的解决方案。 JS的性能很大程度上依赖于javascript引擎,未来会优化js的哪些部分。因此,您应该始终编写某种性能测试(或使用准备好的测试套件),尤其是像 DOM API 这样的慢速“部分”。好消息是,引擎开发人员倾向于青睐众所周知的解决方案和需要优化的“良好实践”,而他们通常会留下“坏部件”。

以下是关于 innerHTML 与 DOM 附加的一些很好的测试:http://andrew.hedges.name/experiments/innerhtml/ http://andrew.hedges.name/experiments/innerhtml/

附加到 DOm 而不创建“虚拟”div:https://coderwall.com/p/o9ws2g/why-you-should-always-append-dom-elements-using-documentfragments https://coderwall.com/p/o9ws2g/why-you-should-always-append-dom-elements-using-documentfragments

以及有关 .innerHTML、.appendChild、.insertAdjacentHTML 的更多技术解释”“innerHTML += ...”与“appendChild(txtNode)” https://stackoverflow.com/questions/2305654/innerhtml-vs-appendchildtxtnode

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DOMParser 与模板和innerHTML 相比的优点 的相关文章

随机推荐

  • Gmail、Yahoo、Facebook、Twitter 联系人 PHP 中的导入器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • iOS:在后台更新媒体信息

    我目前在我的应用程序中使用 MPNowPlayingInfoCenter 来显示正在播放哪首歌曲 但我希望将 HTTP Live Streaming 合并到我的应用程序中 该应用程序将在后台出现任意数量的不同曲目 有没有办法在应用程序处于后
  • 使用第三方库

    我想集成一个Timeline http visjs org docs timeline 在我的镀铬扩展中 我已经下载了这个插件的js文件和css文件 并将它们放在我的chrome扩展的根目录中 chrome 扩展本身只是向现有页面注入JS并
  • Hibernate 中 load() 与 get() 相比有何优势?

    谁能告诉我有什么好处load vs get 在休眠状态下 这些方法的语义解释并不能解释它们之间的实际差异 实际规则如下 Use get 当你想加载一个对象时 Use load 当您需要获取对象的引用而不发出额外的 SQL 查询时 例如 创建
  • 将单独的日志级别记录到 log4j2 属性文件中的单独文件

    有什么办法可以为不同的日志级别创建单独的日志文件吗 我想要的只是记录error记录到一个文件并info记录到另一个文件 我没有找到任何解决方案来做到这一点log4j2 properties 这里是log4j2 xml我得到了并且效果很好 谁
  • 如何在vim中在新窗口中打开新文件

    有没有办法在新的 shell 窗口或选项卡中打开 vim 我习惯做 mate file 这会在新窗口中打开文件 我更喜欢有一个 中央外壳 我可以根据需要在其他窗口或选项卡中发出命令并编辑文件 人们通常如何在本地打开 vim 文件 从 vim
  • 如何使用 Google App Engine Blobstore 保存网页图像

    UPDATE 这个问题最初是在不支持编程文件创建 例如通过 url 的情况下提出的 这已经改变了 请参阅 http code google com appengine docs java blobstore overview html Wr
  • 电容器推送通知和 FCM 生成不同的令牌,导致 android 崩溃

    带有 Capacitor 推送通知和 FCM 插件的 Ionic 5 应用程序 import FCM from capacitor community fcm import ActionPerformed PushNotificationS
  • 厨师从模板和刀搜索中创建逗号分隔的字符串

    我正在尝试从 Knife 查询创建动态创建的以逗号分隔的 Splunk 索引器列表 数据端口附加到每个主机名 该查询将返回的主机列表提供给模板和相应的 erb 然而 尽管当我聚合到测试 Docker 实例时没有抛出任何错误 但 conf 文
  • 登录多线程应用程序,在构造函数中使用互斥体

    我一直在编写一个基于 RAII 的 C 方法入口 出口记录器 用法是这样的 void Class Method METHOD NAME Class Method I know I could use FUNCTION instead lt
  • 如何获取值数组作为 plusargs?

    如何获取值数组作为参数 我需要从命令行获取一组未定义大小的命令 如何将这些参数放入数组或队列中 Eg CMDS READ WRITE READ N WRITE 它应该被带到一个数组中 value plusargs不支持数组 但支持字符串 看
  • 帮助重新采样/上采样

    我有一个包含 240 个数据点的数组 采样频率为 600hz 代表 400ms 我需要将此数据重新采样为以 1024hz 采样的 512 个数据点 代表 500ms 我假设因为我从 400 毫秒的数据开始 所以最后 100 毫秒只需要用 0
  • 无法在新创建的 GKE 集群上初始化 helm (tiller)

    我刚刚在 Google Cloud 平台上创建了一个 GKE 集群 我已经在云控制台安装了helm helm version version BuildInfo Version v3 0 0 GitCommit e29ce2a54e96cd
  • 移动的pdf文件的htaccess规则?

    我已经尝试过 我真的已经 我屈服了 Wordpress 和 htaccess 哦 痛苦 旧的静态站点的根目录中有 pdf doc xls 和 zip 文件 我已将所有文件作为媒体项加载 因此它们都位于 wp content uploads
  • 如何使用 prisma 和 postgresql 处理条件准备语句?

    我有一个搜索查询 其参数根据客户端输入而变化 await prisma queryRaw SELECT column FROM table condition WHERE column condition 如何使用准备好的语句编写此查询并避
  • 如何使用 NSURLSession 和 Delegate 方法连接到 Web 服务?

    我正在尝试连接 iOS 中的网络服务 但遇到了很多问题 我在这里找到了一个练习网络服务 http www w3schools com webservices tempconvert asmx op CelsiusToFahrenheit h
  • Moodle 用户注册 API

    我被要求创建一个引擎 将 SQL 数据转换为 Moodle 数据 用户 课程 注册 我陷入了困境 我需要使用 Moodle API 以编程方式注册学生 而不需要操作数据库 例如 enroll user courseid userid 有人对
  • Pandas 数据帧最大值和最小值

    我有一个 pandas 数据框 如下所示 A B 288 1 4 245 2 3 543 3 6 867 1 9 345 2 7 122 3 8 233
  • 为什么我们在连接数据库时使用Class.forName(“oracle.jdbc.driver.OracleDriver”)?

    实际用途是什么Class forName oracle jdbc driver OracleDriver 连接到数据库时 为什么我们不能只导入同一个类 而是加载它 使用背后的基本思想Class forName 是加载 JDBC 驱动程序实现
  • DOMParser 与模板和innerHTML 相比的优点

    我正在寻找处理解析 HTML 或 XHTML XML 序列化 标记并将其插入网页 DOM 的最佳方法 该网页可以是 text html 或 application xhtml xml 不打算使用像 jQuery 这样的库 并且只关心与最新版