Если innerHTML - это зло, то как лучше изменить текст ссылки?

Обратите внимание, что (.|\n)* может быть менее эффективным, чем (например) [\s\S]* (если регулярные выражения вашего языка поддерживают такие escape-последовательности), а не поиск того, как указать модификатор, который делает. также соответствуют новостям. Или вы можете пойти с альтернативами POSIXy, такими как [[:space:][:^space:]]*.

13
задан 28 December 2008 в 00:40
поделиться

7 ответов

innerHTML не является злым вообще. Нет ничего неправильно с использованием его, пока Вы знаете о последствиях.

7
ответ дан Kon 28 December 2008 в 00:40
поделиться

Как насчет

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

Это не пострадает от проблем, описанных PEZ.

Относительно комментария Триптиха и ответа bobince, вот другое решение:

var oldLink = document.getElementById('mylink'),
    newLink = oldLink.cloneNode(false);
newLink.appendChild(document.createTextNode(new_text));
oldLink.parentNode.replaceChild(newLink, oldLink);
9
ответ дан Christoph 28 December 2008 в 00:40
поделиться

Для браузеров, поддерживающих DOM3, можно использовать textContent:

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

Это работает в FF (протестированный в 3), Opera (протестированный в 9,6) и Chrome (протестированный в 1), но не в MSIE7 (не протестировали в MSIE8)

Добавленный пример

, Это не симпатично, но должно работать перекрестный браузер (протестированный в победе в FF3, Opera9.6, Crome1 и MSIE7)

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));
    }
}

(обновленный: добавленная поддержка Microsofts собственный innerText)

5
ответ дан some 28 December 2008 в 00:40
поделиться

innerHTML имеет побочные эффекты (как разъединение существующих узлов DOM и перерендеринг, который мог бы быть тяжелым). Нужно знать об этих эффектах. И любой поддерживающий код должен будет остерегаться этого, innerHTML используется, или они могли бы столкнуться со странными ошибками.

4
ответ дан PEZ 28 December 2008 в 00:40
поделиться

Возможно, это - просто некоторые типичные наркоманы, которые отвергают идею innerHTML.

innerHTML является практическим стандартом, потому что все браузеры реализуют его, хотя это не стандарт W3C.

Просто использование это. Это работает как очарование.

3
ответ дан datasn.io 28 December 2008 в 00:40
поделиться

Вплоть до год назад, innerHTML был просто намного быстрее, чем управление событиями через DOM. Я не проверил последние версии всех главных браузеров для этого сам.

Firefox, например, не обрабатывает это хорошо. Это иногда только обновляет экран для отражения изменения. При запросах DOM после изменения он все еще имеет старые значения.

Пример: попытайтесь изменить значение текстовой области через innerHTML и затем отправить форму. Это тихо отправит значение, которое текстовая область имела прежде. Думайте о катастрофических результатах, которые что-то как этот могло иметь.

4
ответ дан Wouter van Nifterick 28 December 2008 в 00:40
поделиться

Другая опция состоит в том, чтобы иметь два отделения и использовать .hide () & .show ().

0
ответ дан Todd Smith 28 December 2008 в 00:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: