【问题标题】:getAttribute("name") unescapes html?getAttribute("name") 取消转义 html?
【发布时间】:2012-06-28 18:37:34
【问题描述】:

我们有一些自定义的 JS 脚本来处理工具提示,这些脚本在我们渲染页面时放在一个 dom 属性(工具提示)中。

但是,当我尝试检索此工具提示(显示为 div)时,javaScript 似乎会自动取消转义属性值。这是正常行为吗?有没有办法避免这种情况?

我遇到的问题是 变成(无效的)html。

复制示例:

<div tltip ="&lt;text&gt;" id="escaped" />
<div tltip ="<text>"id="notescaped" />

js:

a  = document.getElementById("escaped").getAttribute("tooltip");
b  = document.getElementById("notescaped").getAttribute("tooltip");
a.match("<"); //returns true (unexpected)
a.match("<"); //returns true (expected)
a == b; // returns true (unexpected)

编辑:

澄清我试图显示一个(div)工具提示,我想以某种方式阅读内容,例如: "&lt;b&gt; &amp;lt;email@example.com&amp;gt &lt;\b&gt;" 来自 dom 并将其显示在一个 div 中,它应该看起来像:“

【问题讨论】:

  • 我认为浏览器在解析 HTML 并创建 DOM 时会自动执行此操作。
  • 你不应该真的需要编码字符。只需将属性值添加到&lt;div&gt; 作为文本节点,不使用innerHTML
  • 问题是我不希望它作为文本节点我希望粗体标签也能工作,但我不想将括号中的电子邮件地址解释为(无效的 html),这就是为什么电子邮件括号在属性中是 htlmEscaped (而不是粗体标签)。我的问题在于转义和未转义的括号都被视为相同。
  • 我目前正在双重转义电子邮件地址,但这感觉有点 hacky

标签: javascript html dom


【解决方案1】:

不是 JavaScript 对字符进行“转义”,而是 HTML 解析器对实体进行解码。这是预期的行为。

如果这听起来不合逻辑,请告诉我如何在属性中添加双引号和单引号。

<div tltip=""'">          does not work.
<div tltip="&quot;'">     does work.
<div tltip='"&#39;'>      does work.
<div tltip="&quot;&#39;"> does work.

关于已编辑的问题
您不必阅读原始源代码。例如:

<div tltip="&lt;b&gt;test&lt;/b&gt;" id="test"></div>

var output1 = document.getElementById('html');
var output2 = document.getElementById('plain');
var attrValue = document.getElementById('test').getAttribute('tltip');
output1.innerHTML = attrValue;
output2.textContent = attrValue;

将呈现为:

输出 1:测试
输出 2:测试

textContent 在旧 IE 版本中不受支持。一种跨浏览器兼容的方式是:

output2[document.textContent === null ? 'textContent' : 'innerText'] = attrValue;
// OR
output2.innerHTML = ''; // Empty contents
output2.appendChild(document.createTextNode(attrValue));

如果您仍想解码实体,则以下操作将起作用:

// <b> -> &lt;b&gt;
function decode(strHTML) {
    var tmp = document.createElement('div');
    tmp.appendChild(document.createTextNode(strHTML));
    return tmp.innerHTML;
}

【讨论】:

  • 第二个例子不应该包含第二个双引号吗?
  • 我明白你的意思。这是否意味着不可能从 html 属性中获取文字形式的 html 实体(< 而不是
  • @pvgoddijn:也许这有帮助:stackoverflow.com/questions/5499078/…
  • @pvgoddijn 更新了答案。您可能不必解码实体。
猜你喜欢
  • 1970-01-01
  • 2021-07-30
  • 2010-10-14
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
相关资源
最近更新 更多