13

我知道 innerHTML 被认为是邪恶的,但我认为这是更改链接文本的最简单方法。例如:

<a id="mylink" href="">click me</a>

在 JS 中,您可以使用以下方式更改文本:

document.getElementById("mylink").innerHTML = new_text;

在原型/jQuery 中:

$("mylink").innerHTML = new_text;

工作正常。否则,您必须先替换所有子节点,然后添加一个文本节点。何必?

4

7 回答 7

9

怎么样

document.getElementById('mylink').firstChild.nodeValue = new_text;

这不会受到 PEZ 描述的问题的影响。

关于 Triptych 的评论和 bobince 的回复,这里有另一个解决方案:

var oldLink = document.getElementById('mylink'),
    newLink = oldLink.cloneNode(false);
newLink.appendChild(document.createTextNode(new_text));
oldLink.parentNode.replaceChild(newLink, oldLink);
于 2008-12-27T15:06:52.747 回答
7

innerHTML 一点也不邪恶。只要你知道后果,使用它没有任何问题。

于 2008-12-27T14:54:07.547 回答
5

对于支持 DOM3 的浏览器,您可以使用textContent

document.getElementById("mylink").textContent = new_text;

这适用于 FF(在 3 中测试)、Opera(在 9.6 中测试)和 Chrome(在 1 中测试),但不适用于 MSIE7(尚未在 MSIE8 中测试)

添加示例

它不漂亮,但应该可以跨浏览器工作(在 FF3、Opera9.6、Crome1 和 MSIE7 中的 win 中测试)

function replaceTextContent(element,text) {
    if (typeof element ==="string") element = document.getElementById(element);
    if (!element||element.nodeType!==1) return;
    if ("textContent" in element) {
        element.textContent = text; //Standard, DOM3

    } else if ("innerText" in element) {
        element.innerText = text; //Proprietary, Micosoft
    } else {
        //Older standard, even supported by Microsoft
        while (element.childNodes.length) element.removeChild(element.lastChild);
        element.appendChild(document.createTextNode(text));
    }
}

(更新:增加了对微软专有的 innerText 的支持)

于 2008-12-27T16:09:37.830 回答
4

innerHTML 有副作用(比如断开现有的 DOM 节点并重新呈现可能很繁重)。人们需要意识到这些影响。任何维护代码的人都需要注意使用了innerHTML,否则他们可能会遇到奇怪的错误。

于 2008-12-27T14:46:48.187 回答
4

直到一年前,innerHTML 还比通过 DOM 操作事件快得多。我自己还没有检查过所有主要浏览器的最新版本。

例如 Firefox 就不能很好地处理这个问题。它有时只更新屏幕以反映更改。如果您在更改后查询 DOM,它仍然具有旧值。

示例:尝试通过 innerHTML 更改文本区域的值,然后发布表单。它会默默地发布 textarea 之前的值。想想这样的事情可能会造成的灾难性后果。

于 2008-12-27T15:04:08.370 回答
3

也许只是一些标准的瘾君子拒绝了 innerHTML 的想法。

innerHTML 是实用标准,因为所有浏览器都实现了它,尽管它不是 W3C 标准。

就用它吧。它就像一个魅力。

于 2008-12-27T15:03:19.290 回答
0

另一种选择是拥有两个 div 并使用 .hide() 和 .show()。

于 2008-12-27T15:04:36.840 回答