.innerHTML 与 createElement() | setAttribute() 与直接*

Posted

技术标签:

【中文标题】.innerHTML 与 createElement() | setAttribute() 与直接*【英文标题】:.innerHTML vs. createElement() | setAttribute() vs. Direct* 【发布时间】:2011-10-10 15:54:59 【问题描述】:

我被告知这不“正确”,直到我开始在 IE9 中遇到运行时错误时我才担心它。这是我需要转换为使用对象属性的代码。 为什么 innerhtml 不被认为是最佳实践?

  var c=document.createElement('div');
  c.innerHTML= '<a name="a1" class="b" href="' + d[2].value + '">' + d[1].value + '</a>';

【问题讨论】:

永远不要把 A 放在 A 里面 ;) 【参考方案1】:

奇怪的是,您将 A 元素放在 A 元素中,但下面应该可以工作。

var c=document.createElement('a');
c.name = "a1";
c.className = "b";
c.href = d[2].value;
c.appendChild(document.createTextNode(d[1].value));

这假设 d[1].value 不知道是来自受信任来源的格式良好的 HTML,因此它可能比 innerHTML 代码更能抵抗 XSS。

【讨论】:

“我拒绝你的现实,代之以我自己的。” 听说您喜欢 HTML,所以我锚定了您的锚点,以便您可以链接到您的链接。 @MikeSamuel LMAO!太搞笑了!【参考方案2】:

innerHTML 非常好,只是你没有正确使用它。

innerHTML 以标签的内容为目标。表示 &lt;a&gt;&lt;/a&gt; 之间

您需要使用 setAttribute 设置您的 d[2].value d[1].value 使用 innerHTML

这应该没问题(未经测试)

  var c=document.createElement('a');
  c.setAttribute("href",d[2].value);
  c.setAttribute("name","a1");
  c.setAttribute("class","b");
  c.innerHTML = d[1].value;

查看setAttribute(方法)和innerHTML(属性)的这些参考和示例

【讨论】:

标准 HTML 属性不需要 setAttribute,只需设置 DOM 属性即可。它更可靠、更快。 感谢您提供的信息!当涉及到非标准 html 属性时,我不确定。【参考方案3】:

看起来您正在创建一个锚点 - 通过使用 document.createElement('a') - 然后在其中创建另一个锚点。所以,基本上你的 HTML 看起来像这样:

<a>
    <a href="www.google.com">Click Here</a>
</a>

这是不对的。这就是为什么使用innerHTML 作为锚点不好的原因。我认为你应该这样做:

c.setAttribute('class', 'signature'); 
c.setAttribute('href', 'xyz');

等等。

您也可以使用 javascript 直接在锚点上设置 href 和其他属性。请参阅http://www.w3schools.com/jsref/dom_obj_anchor.asp(锚对象属性)。

【讨论】:

以上是关于.innerHTML 与 createElement() | setAttribute() 与直接*的主要内容,如果未能解决你的问题,请参考以下文章

createElement() 与 innerHTML 啥时候使用?

innerHTML 可以与 XML 元素一起使用吗?

.innerHTML 与 createElement() | setAttribute() 与直接*

创建/附加节点与innerHTML

innertext与innerhtml

JQuery中的文本与innerHTML