javascript - 如何在 React 的新选项卡中打开一些子链接
问题描述
我有一个用 React (NextJS) 构建的页面,我正在从 Wordpress 中提取一些标记字符串内容并将其插入到我的JSX
.
...
<div className="wrapper">
<p
className="text-content"
dangerouslySetInnerHTML={{ __html: post.content.rendered }}
></p>
</div>
...
现在,标记可能包含链接,我想在新选项卡上打开所有这些链接。所以我尝试了:
...
<div className="wrapper">
<base target="_blank" />
<p
className="text-content"
dangerouslySetInnerHTML={{ __html: post.content.rendered }}
></p>
</div>
...
并且标记中的所有链接都在新选项卡上打开,非常棒。但问题是页面中的所有其他链接(包括div.wrapper
元素外部的链接)都在新选项卡中打开(因为<base />
范围是整个页面),我想防止这种情况发生。
由于我不能<base />
在同一页面上使用多个,我知道的另一个选项是遍历感兴趣的锚标记document.querySelector(".wrapper a")
并将target
属性添加到所有这些标记,但是在 React 中,它是修改 DOM 的反模式直接地。
所以我不确定如何最好地进行。我该怎么办?
解决方案
您可以使用 DOMParser API 来实现这一点。
这是一个小片段
const parser = new DOMParser();
const htmlText = `<div><a href="#some-url">Url link</a></div>`;
let content = parser.parseFromString(htmlText, "text/html");
const anchors = content.getElementsByTagName('a');
Array.from(anchors).forEach(a => {
a.setAttribute("target", "_blank");
})
console.log(content.body.innerHTML); // Here it is your new string
代码可能需要改进一下,我刚刚从 MDN 示例中输入了这个,我没有时间测试它。这行得通吗?
推荐阅读
- java - alipne docker 映像上的 firefox 二进制文件在哪里?
- flutter - 如果 onPressed 中有更多代码,则 Snackbar 不会显示
- sql - 两个子查询单独工作正常,但是当加入时“SQL 命令未正确结束”,除了 [解释说我是五岁]
- flutter - Flutter:如何去除BottomNavigationBar的边框?
- javascript - 替换变量的文本
- html - 使用 Google 翻译进行网页抓取不起作用
- spring-boot - 使用rest模板将文本表单数据curl请求转换为java代码
- javascript - 每个元素的单击事件或文档上的所有单击事件?
- performance - Prometheus 不会从 PCP pmproxy 中抓取所有指标
- tensorflow - 继续训练 CoreML 模型