2009-08-31 2 views

ответ

407
document.getElementById("myspan").innerHTML="newtext"; 

EDIT Для современных браузеров:

document.getElementById("myspan").textContent="newtext"; 
+22

Перед показом любой пользователь ввел строку таким образом, вы должны сначала проверить, что он не содержит разметки HTML, иначе могут возникнуть проблемы с безопасностью (XSS). – pafcu

+0

как вы вставляете атрибут стиля в 'span', используя javascript здесь? – bouncingHippo

+1

@bouncingHippo document.getElementById ("myspan"). SetAttribute ("style", "cssvalues"); – Gregoire

29
document.getElementById('myspan').innerHTML = 'newtext'; 
52

Использование innerHTML является SO НЕ РЕКОМЕНДУЕТСЯ. Вместо этого вы должны создать textNode. Таким образом, вы «привязываете» свой текст, и вы, по крайней мере, в этом случае не уязвимы для атаки XSS.

document.getElementById("myspan").innerHTML = "sometext"; //INSECURE!! 

Правильный путь:

span = document.getElementById("myspan"); 
txt = document.createTextNode("your cool text"); 
span.appendChild(txt); 

Для получения дополнительной информации об этой уязвимости: Cross Site Scripting (XSS) - OWASP

Отредактировано 4 ноября 2017:

Модифицированная третья строка кода в соответствии с @mumush предложением: msgstr "использовать appendChild() вместо.
Btw, в соответствии с @Jimbo Jonny Я думаю, что все должно рассматриваться как пользовательский ввод, применяя принцип безопасности по слоям. Таким образом, вы не встретите никаких сюрпризов.

+5

Хотя вы абсолютно правильно относитесь к 'innerHTML', требуя осторожности, обратите внимание, что ваше решение использует' innerText', который не поддерживается в Firefox. http://www.quirksmode.org/dom/html/ Он также использует 'textContent', который не поддерживается в IE8. Вы можете структурировать код, чтобы обойти эти проблемы. – Trott

+4

Используйте 'span.appendChild (txt);' вместо этого! – mumush

+17

В вопросе ничего не говорится о пользовательском вводе, поэтому заявление о том, что 'innerHTML' не рекомендуется, является смешным. Не говоря уже о том, что он по-прежнему хорошо очищается. Идея о том, что нужно дезинформировать пользовательский ввод, не относится к этому конкретному вопросу. В лучшем случае это заслуживает маленькой заметки в конце, говорящей «btw: если пользователь вводит данные, обязательно сначала санируйте или используйте метод X, который ему не нужен». –

19

Если вы один подачи текста и никакая часть текста поставляется пользователем (или какой-либо другой источник, который вы не контролируете), то установка innerHTML отлично:

// * Fine for hardcoded text strings like this one or strings you otherwise 
// control. 
// * Not OK for user-supplied input or strings you don't control unless 
// you know what you are doing and have sanitized the string first. 
document.getElementById('myspan').innerHTML = 'newtext'; 

Однако , как отмечают другие, если вы не являетесь источником какой-либо части текстовой строки, используя innerHTML, вы можете подвергать вас атакам, связанным с инъекциями контента, например, XSS, если вы не будете осторожны, прежде чем правильно деактивировать текст.

Если вы используете входные данные от пользователя, вот один из способов сделать это безопасно, а также сохраняя совместимость с различными браузерами:

var span = document.getElementById('myspan'); 
span.innerText = span.textContent = 'newtext'; 

Firefox не поддерживает innerText и IE8 не поддерживает textContent так вам необходимо использовать оба варианта, если вы хотите поддерживать совместимость между браузерами.

И если вы хотите, чтобы избежать перекомпоновки (вызванные innerText), где это возможно:

var span = document.getElementById('myspan'); 
if ('textContent' in span) { 
    span.textContent = 'newtext'; 
} else { 
    span.innerText = 'newtext'; 
} 
4

Вот еще один способ:

var myspan = document.getElementById('myspan'); 

if (myspan.innerText) { 
    myspan.innerText = "newtext"; 
} 
else 
if (myspan.textContent) { 
     myspan.textContent = "newtext"; 
} 

Свойство InnerText будет обнаружен Safari, Google Chrome и MSIE , Для Firefox стандартным способом делать вещи было использование textContent, но с версии 45 он тоже имеет свойство innerText, так как кто-то любезно сообщил мне недавно.Это решение проверяет, поддерживает ли браузер одно из этих свойств, и если это так, назначает «новый текст».

Живая демонстрация: here

+1

Firefox реализовал поддержку innerText в [release 45] (https://developer.mozilla.org/en-US/Firefox/Releases/45). – user3351605

8

Я использую Jquery и ни один из вышеуказанных способов помогли, я не знаю, почему, но это работает:

$("#span_id").text("new_value"); 
0

Как и в другом ответе, innerHTML и InnerText не рекомендуется, лучше использовать textContent. Этот атрибут хорошо поддерживается, вы можете проверить это следующим: http://caniuse.com/#search=textContent

0

Для этого диапазона

<span id="name">sdfsdf</span> 

Вы можете идти, как это: -

$("name").firstChild.nodeValue = "Hello" + "World"; 
Смежные вопросы