javascript - 如果两个 DOMString 在 JavaScript 中代表相同的 DOM 节点,最有效的方法就是比较它们
问题描述
我使用 ReactJs 函数renderToStaticMarkup来创建 HTML 标记。标记位于 App 中的另一个位置,作为其他 DOM 节点的innerHTML属性。由于我想防止图像和iframe重新渲染,我想进行比较,如果当前的innerHTML与它应该设置的不同。
if (!domNode.innerHTML !== newMarkup);
domNode.innerHTML = newMarkup;
}
出于某种原因,Reacts renderToStaticMarkup为图像创建 HTML 标记为:
<img src="https://placebeard.it/200x150" alt="" class="content-media-image-linked"/>
但 DOM innerHTML的值为
<img src="https://placebeard.it/200x150" alt="" class="content-media-image-linked">
所以基本上区别在于尾随/
(但这不需要是经验法则)
我想知道确定这两个 DOMString 是否代表同一个 DOM 节点的最有效/最快的方法是什么。
1.字符串比较
替换/删除所有出现的/>
2. 解析/转换为 DOMNodes
这是更安全的方法,但也更昂贵。我将不得不使用类似的东西document.createRange().createContextualFragment
(参见这篇文章),而不是使用该isEqualNode
方法。
有人有更好的建议吗?
解决方案
我想你知道,标签末尾的/
in/>
在 HTML 中没有任何意义(它在 XHTML 和 JSX 中如此),所以我的诱惑是
更改
/>
为>
并比较;如果它们匹配,它们是相同的。如果它们不匹配,请解析并使用
isEqualNode
在我认为大多数情况下,第一个让你快速获胜。第二种以更慢但更健壮的方式工作,允许属性以不同的顺序排列而不引入差异(除非它产生差异)等。
当替换/>
with>
时,当然要确保只在正确的位置这样做,这可能会或可能不会很棘手,具体取决于您正在处理的字符串(例如,它们包含嵌套的 HTML 等)。(如果 HTML 不是像您的示例那样的单个元素,“您不能只使用简单的正则表达式”中的“棘手” img
。)
推荐阅读
- angular - 使用 `ng s` 命令在特定主机上运行 Angular 项目
- c# - 使用 newtonsoft.json 从 httprequest 中只获取几个属性
- python - 这个空白是从哪里来的?
- xcode - 无法启动内置于 Xcode 的 macOS 应用程序
- r - 计算值随时间的变化
- c# - 流利的验证检查空或最小最大字符串长度
- google-apps-script - 如何在 Google Apps 脚本中将简单公式加 1?
- azure-logic-apps - 将数组中的值获取到变量中 [Azure Logic App]
- python - Python Django 类语法错误
- c# - 使用 client_Id 和 client_secret 为共享点生成访问令牌时出现未经授权的异常