【问题标题】:Unable to modify innerHTML for anchor element无法修改锚元素的 innerHTML
【发布时间】:2019-07-30 19:25:05
【问题描述】:

我正在尝试使用 angular renderer2 通过 DOM 操作添加一些样式。

我可以更新 anchor 期望的所有 html 元素的样式。

在下面的例子中,我试图用这个 World 替换这个文本 www.url.com 到一个锚链接。

注意:仅尝试更改文本,而不是 href

  styleList = [
    {
      ori: 'www.url.com',
      replace: 'World'
    }
  ];

当我检查 <a href="wWorld">www.url.com</a> 时,replace 文本被添加到 href

所以预期的输出应该是<a href="wwww.url.com">World</a>

为什么这只发生在anchor标签上?

下面是更新DOM的函数

styleList.forEach(styleItem => {
  for (const childNode of childNodes) {
    renderer.setProperty(childNode, 'innerHTML', childNode.innerHTML.replace(styleItem.ori, styleItem.replace));
  }
});

您可以查看此stackblitz 链接以供参考。

请帮忙。

【问题讨论】:

  • 它不是关于 css,它是 styleList,它会告诉用什么文本替换
  • 代码中的问题是您正在替换事件“href”与您的正则表达式匹配的文本。尝试更改为'>www.url.com<''><i>World</i><',这将起作用。如果仍然可以使用空格字符,您也可以匹配空格字符。另外,我认为像您所做的那样更改 HTML 并不是一个好主意。 1)在这里使用渲染器没有任何意义。 2)如果您需要转换显示值,您可以创建一个管道,该管道将处理一个值并使用映射匹配文本(使用键值对)
  • 为什么 href 被替换,而不是您可以在此处阅读的文本 w3schools.com/jsref/jsref_replace.asp 注释
  • 只有anchor怎么办?
  • 您的设计是这里的问题。你需要重新架构

标签: javascript html angular typescript renderer


【解决方案1】:

这是我取得的成就 https://stackblitz.com/edit/angular-mdhle9?file=src/app/style.service.ts

我做的主要事情是更改您的服务以使用 RegExp 组

for (const childNode of childNodes) {
   const regex = new RegExp('<(.*)>' + styleItem.ori + '<(.*)>')

   renderer.setProperty(childNode, 'innerHTML', childNode.innerHTML.replace(regex, '<$1>' + styleItem.replace + '<$2>'));
}

在这里我创建了两个匹配的组,它们将复制 HTML 开始和结束标记的内部。

然后我只需将这些组(内部标签)返回到 &lt; &gt; 并将值放在它们之间。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 2011-08-24
相关资源
最近更新 更多