Jak zamienić tekst w elemencie div?


166

Muszę dynamicznie ustawić tekst w elemencie DIV. Jakie jest najlepsze, bezpieczne podejście do przeglądarki? Mam dostępne prototypejs i scriptaculous.

<div id="panel">
  <div id="field_name">TEXT GOES HERE</div>
</div>

Oto jak będzie wyglądać funkcja:

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById('field_name');
  //Make replacement here
}

Czy zaakceptowana odpowiedź robi to, co chcesz, gdy przypisany jest tekst, taki jak: - <span style = "font-size: 36pt"> To jest duże </span>. Jeśli takie zachowanie jest pożądane, czy możesz zmienić sformułowanie pytania, aby pasowało?
AnthonyWJones,

Czy można to wykorzystać w ataku polegającym na wstrzyknięciu XSS?
James Westgate

Odpowiedzi:


49

Użyłbym updatemetody Prototype, która obsługuje zwykły tekst, fragment kodu HTML lub dowolny obiekt JavaScript, który definiuje toStringmetodę.

$("field_name").update("New text");

26
@Aeyoun OP sugerował, że już używali Prototype, więc jeśli tak jest, warto to wykorzystać.
John Topley

6
Dlaczego dla mnie działa tylko z$("field_name").text("new text");
Drako

@Drako Czy używasz PrototypeJS?
John Topley

10
@Drako Oryginalne pytanie i moja odpowiedź sprzed siedmiu lat dotyczą PrototypeJS, a nie jQuery.
John Topley

255

Możesz po prostu użyć:

fieldNameElement.innerHTML = "My new text!";

2
Czy nie należy używać pojedynczych cudzysłowów w tekście „statycznym”?
Milan Babuškov

5
W PHP tak. W JavaScript nie uważam, że ma to znaczenie.
ceejayoz

46
W JavaScript pojedyncze i podwójne cudzysłowy są wymienne.
17 z 26

18
zła rada, ponieważ tekst może przez przypadek zawierać treść podobną do znaczników HTML
Trident D'Gao

10
element.innerHTML = "<script>doSomethingMalicious()</script>";nie będzie dobrym pomysłem. element.innerHTML = "& neither will this";
Joseph Nields

175

Zaktualizowano dla wszystkich, którzy to czytają w 2013 i później:

Ta odpowiedź ma dużo SEO, ale wszystkie odpowiedzi są poważnie nieaktualne i zależą od bibliotek, aby robić rzeczy, które wszystkie obecne przeglądarki robią po wyjęciu z pudełka.

Aby zamienić tekst w elemencie div, użyj Node.textContent, który jest dostępny we wszystkich obecnych przeglądarkach.

fieldNameElement.textContent = "New text";

10
@Legolas Stąd dwa lata temu napisanie „aktualnej przeglądarki”.
mikemaccana

2
Dziękuję Ci! Próbowałem innych odpowiedzi, zastanawiając się, dlaczego „innerHTML” nie działa.
GreySage

2
Możesz rozważyć wyjaśnienie, dlaczego textContentjest lepszą metodą niż innerHTML: jest szybsza, bezpieczniejsza i bardziej odpowiednia, gdy nie próbuje się celowo wstawiać znaczników HTML.
CertainPerformance

75

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById("field_name");
  while(fieldNameElement.childNodes.length >= 1) {
    fieldNameElement.removeChild(fieldNameElement.firstChild);
  }
  fieldNameElement.appendChild(fieldNameElement.ownerDocument.createTextNode(fieldName));
}

Zalety zrobienia tego w ten sposób:

  1. Używa tylko DOM, więc technika ta jest przenośna do innych języków i nie opiera się na niestandardowym innerHTML
  2. fieldName może zawierać kod HTML, który może być próbą ataku XSS. Jeśli wiemy, że to tylko tekst, powinniśmy utworzyć węzeł tekstowy, zamiast mieć przeglądarkę na parsowaniu go pod kątem HTML

Gdybym miał użyć biblioteki javascript, użyłbym jQuery i zrobiłbym to:


  $("div#field_name").text(fieldName);

Zwróć uwagę, że komentarz @AnthonyWJones jest poprawny: „nazwa_pola” nie jest szczególnie opisowym identyfikatorem ani nazwą zmiennej.


Na jakie inne języki możesz przenieść tę technikę?
John Topley,

Obsługuje to każdy język z implementacją DOM (a większość języków ma implementację DOM).
Quentin,

To dobra odpowiedź, lepsza od mojej i poprawna odpowiedź. Możesz jednak rozważyć uporządkowanie przykładu. „nazwa pola” nie jest dobrą nazwą dla parametru funkcji. W rzeczywistości najlepiej byłoby wziąć dwa jeden dla identyfikatora elementu, a drugi dla treści, tj; elemID, content
AnthonyWJones,

Pożyczyłem fieldName i identyfikator z samego pytania.
Daniel Papasian,

Pytanie prawdopodobnie użyło nazwa_pola, aby uczynić przykład ogólnym. Pytający wspomina również, że dostępny jest Prototype, ale nie jQuery.
John Topley,

17
$('field_name').innerHTML = 'Your text.';

Jedną z fajnych funkcji Prototype jest $('field_name')to samo, codocument.getElementById('field_name') . Użyj tego! :-)

Odpowiedź Johna Topleya wykorzystująca updatefunkcję Prototype to kolejne dobre rozwiązanie.


4
To nie wygląda jak JavaScript?
Milan Babuškov

1
Nie używaj innerHTML. To nie jest zalecenie w3c i zachowuje się niekonsekwentnie. Uważany jest za zły styl.
Tom

Tom, czego należy użyć zamiast tego (jeśli nie używasz Prototype)?
Milan Babuškov

1
Milan, bardziej akceptowanym sposobem jest zapętlenie przez childNodes, wywołanie na każdym z nich removeNode (true), a następnie dołączenie nowych węzłów utworzonych za pomocą funkcji document.createElement () lub document.createTextNode (). Jeśli musisz to zrobić, zalecałbym napisanie funkcji, aby uniknąć dużego wpisywania.
Joel Anair

3
@RaduSimionescu Nie, nie jest. To pytanie i odpowiedź dotyczą Prototype.js, a nie jQuery. W Prototype $wyszukuje element według identyfikatora. Nie jest oparty na selektorach, jak jQuery. api.prototypejs.org/dom/dollar
ceejayoz

15

Szybką odpowiedzią jest użycie innerHTML (lub metody update prototypu, która prawie to samo). Problem z innerHTML polega na tym, że musisz uciec od przypisywanej treści. W zależności od celów będziesz musiał to zrobić z innym kodem LUB

w IE: -

document.getElementById("field_name").innerText = newText;

w FF: -

document.getElementById("field_name").textContent = newText;

(Właściwie FF mają następujący kod obecny)

HTMLElement.prototype.__defineGetter__("innerText", function () { return this.textContent; })

HTMLElement.prototype.__defineSetter__("innerText", function (inputText) { this.textContent = inputText; })

Teraz mogę po prostu użyć innerText, jeśli potrzebujesz najszerszej możliwej obsługi przeglądarki, to nie jest to kompletne rozwiązanie, ale też nie używa innerHTML w surowym.


7

Jeśli naprawdę chcesz, abyśmy kontynuowali od miejsca, w którym skończyłeś, możesz zrobić:

if (fieldNameElement)
    fieldNameElement.innerHTML = 'some HTML';

5

nodeValue jest również standardową właściwością DOM, której możesz użyć:

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);
  if(fieldNameElement.firstChild)
    fieldNameElement.firstChild.nodeValue = "New Text";
}




0
function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);

  fieldNameElement.removeChild(fieldNameElement.firstChild);
  var newText = document.createTextNode("New Text");
  fieldNameElement.appendChild(newText);
}

Lepiej jest zastąpić węzeł, a następnie usunąć go i dodać nowy jako dwie oddzielne operacje.
Quentin,

0

Oto prosty sposób na jQuery :

var el = $('#yourid .yourclass');

el.html(el.html().replace(/Old Text/ig, "New Text"));

Wydaje się, że to zły pomysł - co się stanie, jeśli Twój element zawiera podwęzły z tym samym tekstem lub dopasowany tekst do części nazwy znacznika elementu? Dlaczego nie używać tylko .text?
James Westgate

Całkowicie zgadzam się z Jamesem Westgate, nie powinienem tego robić.
TGarrett

0

W HTML umieść to

<div id="field_name">TEXT GOES HERE</div>

W JavaScript umieść to

var fieldNameElement = document.getElementById('field_name');
        if (fieldNameElement)
        {fieldNameElement.innerHTML = 'some HTML';}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.