Як змінити текст елемента "span" в JavaScript


388

Якщо у мене проміжок часу, скажіть:

<span id="myspan"> hereismytext </span>

Як за допомогою JavaScript змінити "hereismytext" на "newtext"?

Відповіді:


636

Для сучасних браузерів слід використовувати:

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

Хоча старші веб-переглядачі можуть не знати textContent, його не рекомендується використовувати, innerHTMLоскільки він вводить вразливість XSS, коли новий текст є введенням користувача (див. Інші відповіді нижче для більш детальної дискусії):

//POSSIBLY INSECURE IF NEWTEXT BECOMES A VARIABLE!!
document.getElementById("myspan").innerHTML="newtext";

2
@bouncingHippo document.getElementById ("myspan"). setAttribute ("стиль", "cssvalues");
Gregoire

3
повинен бути певний спосіб об'єднання цих двох відповідей в одну. його точно така ж відповідь.
Герман Інгяльдссон

7
Це не встановлює текст , він встановлює HTML, який принципово відрізняється.
Бред

22
@gregoire - Як уже зазначали інші, ваша відповідь вразлива для XSS. Це питання було розглянуто приблизно в 80 тисяч разів, це означає, що багато людей, ймовірно, взяли на озброєння це рішення і, можливо, ввели непотрібні витоки xss Чи можете ви розглянути можливість оновлення вашої відповіді, щоб textContentзамість цього використовувати нових людей, щоб заохочувати їх використовувати належні та безпечні методи?
Тіддо

2
@Tiddo textContent не підтримується в IE8 та нижче, і я сподіваюся на те, що ви ніколи не використовуєте безпосередньо не санітарний вхід користувача у своєму сценарії.
Грегуар

75

Використання 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 : "замість цього використовувати appendChild ();" Btw
, за словами @Jimbo Jonny, я думаю, що все слід розглядати як вклад користувача, застосовуючи принцип безпеки за шарами. Таким чином ви не зустрінете жодних сюрпризів.


6
Хоча ви абсолютно правильні щодо того, що innerHTMLвимагаєте обережності, врахуйте, що ваше рішення використовує те, innerTextщо не підтримується у Firefox. quirksmode.org/dom/html Він також використовує те, textContentщо не підтримується в IE8. Ви можете структурувати код, щоб подолати ці проблеми.
Тротт

4
Використовуйте span.appendChild(txt);замість цього!
матуся

34
Питання нічого не говорить про введення даних користувача, тому бланк із заявою, який innerHTMLне рекомендується, є смішним. Не кажучи вже про те, що все-таки добре, як тільки дезінфікувати. Ідея, що слід санітувати введення користувачів, НЕ ПОВ'ЯЗАНА з цим конкретним питанням. Щонайбільше це заслуговує на невелику замітку в кінці: "btw: якщо це введення користувача, переконайтеся, що спочатку провести санітарну допомогу або використовувати метод X, який цього не потребує" .
Джимбо Джоні

Плюс до цього, створення елементів ШЛЯХО швидше, ніж використання innerHTML.
Самуель Рондо-Міллер

4
Використання appendChild фактично не змінює текст, він лише додає його. Використовуючи свій код тут, проміжок від початкового питання в кінцевому підсумку прочитає "hereismytextyour cool text". Можливо, span.innerHTML = "";тоді додатиДіту?
ShaneSauce


24

EDIT: Це було написано в 2014 році. Ви, мабуть, більше не переймаєтесь IE8 і можете забути про використання innerText. Просто використовуй textContentі роби з цим, ура.

Якщо ви подаєте текст, і жодна частина тексту не надається користувачем (або іншим джерелом, яким ви не керуєте), то налаштування 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';
}

18

Я використовую, Jqueryі ніщо з вищезгаданого не допомогло, я не знаю, чому це спрацювало:

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

7

Ось ще один спосіб:

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, як мене недавно хтось люб’язно ознайомив. Це рішення перевіряє, чи підтримує браузер будь-який із цих властивостей, і якщо так, призначає "новий текст".

Демонстрація демо: тут


1
Firefox реалізував підтримку innerText у випуску 45 .
користувач3351605

4

Окрім наведених вище чистих відповідей на JavaScript, ви можете використовувати метод тексту jQuery таким чином:

$('#myspan').text('newtext');

Якщо вам потрібно розширити відповідь, щоб отримати / змінити вміст html в елементі span або div, ви можете зробити це:

$('#mydiv').html('<strong>new text</strong>');

Список літератури:

.text (): http://api.jquery.com/text/

.html (): http://api.jquery.com/html/


1

Ви також можете використовувати метод querySelector (), вважаючи, що ідентифікатор 'myspan' унікальний, оскільки метод повертає перший елемент із зазначеним селектором:

document.querySelector('#myspan').textContent = 'newtext';

developer.mozilla


0

Як і в іншу відповідь, innerHTML і InnerText не рекомендується, краще використовувати TextContent . Цей атрибут добре підтримується, ви можете перевірити це: http://caniuse.com/#search=textContent




Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.