Обратите внимание, что (.|\n)*
может быть менее эффективным, чем (например) [\s\S]*
(если регулярные выражения вашего языка поддерживают такие escape-последовательности), а не поиск того, как указать модификатор, который делает. также соответствуют новостям. Или вы можете пойти с альтернативами POSIXy, такими как [[:space:][:^space:]]*
.
innerHTML не является злым вообще. Нет ничего неправильно с использованием его, пока Вы знаете о последствиях.
Как насчет
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);
Для браузеров, поддерживающих 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)
innerHTML имеет побочные эффекты (как разъединение существующих узлов DOM и перерендеринг, который мог бы быть тяжелым). Нужно знать об этих эффектах. И любой поддерживающий код должен будет остерегаться этого, innerHTML используется, или они могли бы столкнуться со странными ошибками.
Возможно, это - просто некоторые типичные наркоманы, которые отвергают идею innerHTML.
innerHTML является практическим стандартом, потому что все браузеры реализуют его, хотя это не стандарт W3C.
Просто использование это. Это работает как очарование.
Вплоть до год назад, innerHTML был просто намного быстрее, чем управление событиями через DOM. Я не проверил последние версии всех главных браузеров для этого сам.
Firefox, например, не обрабатывает это хорошо. Это иногда только обновляет экран для отражения изменения. При запросах DOM после изменения он все еще имеет старые значения.
Пример: попытайтесь изменить значение текстовой области через innerHTML и затем отправить форму. Это тихо отправит значение, которое текстовая область имела прежде. Думайте о катастрофических результатах, которые что-то как этот могло иметь.
Другая опция состоит в том, чтобы иметь два отделения и использовать .hide () & .show ().