Leerzeichen werden von der InnerText-Eigenschaft ignoriert
Lesezeit: 8 Minuten
Arad
Ich versuche, eine Funktion (in JavaScript) zu schreiben, die einen Satz in a schreiben würde <p> Tag, indem Sie beispielsweise die Buchstaben nacheinander mit einer Pause von 300 ms zwischen den einzelnen Buchstaben schreiben. Folgendes habe ich geschrieben:
var text = ["H", "e", "l", "l", "o", " ", "h", "o", "w", " ", "a", "r", "e", "y", "o", "u", "?"]
function typeText() {
var i = 0;
var interval = setInterval(function () {
var parag = document.getElementById("theParagraph");
var paragOldText = parag.innerText;
parag.innerText = paragOldText + text[i];
i++;
if (text.length == i)
clearInterval(interval);
}, 200)
}
Wie Sie sehen können, enthält das Array einige Zeichen „ “ (Leerzeichen); Das Problem ist, dass diese Leerzeichen nicht geschrieben werden, also würde der Satz so lauten: “Hellohowareyou”. Wie löse ich das?
Da keine der anderen Antworten erklären warum Ihr Code funktioniert nicht: Kurz gesagt, es liegt daran innerText stellt den gerenderten Text auf einer Seite dar, was bedeutet, dass der des Elements angewendet wird white-space Regeln. Der Effekt in Ihrem Fall ist, dass umgebende Leerzeichen entfernt werden.
– Konrad Rudolf
12. Dezember 2017 um 10:40 Uhr
Schauen Sie sich den Unterschied zwischen Textinhalt und innerem Text und möglicherweise auch diesen an
– Bergi
12. Dezember 2017 um 14:36 Uhr
Lesen Sie Bergis Kommentar^
– Zack Plauché
24. Juni 2020 um 6:05 Uhr
Verwenden Sie keine Präsentation als Daten. Speichern Sie den aktuellen Inhalt als separaten String, ziehen Sie ihn nicht aus dem DOM. Auf diese Weise sind Sie nicht davon abhängig, wie der Browser den Textinhalt des Elements speichert.
var text = ["H", "e", "l", "l", "o", " ", "h", "o", "w", " ", "a", "r", "e", "y", "o", "u", "?"]
function typeText() {
var i = 0;
var paragText = "";
var interval = setInterval(function () {
var parag = document.getElementById("theParagraph");
paragText += text[i];
parag.innerText = paragText;
i++;
if (text.length == i)
clearInterval(interval);
}, 200)
}
Als Randnotiz könnte dasselbe viel einfacher gemacht werden:
var text = "Hello how are you?";
function typeText() {
var i = 0;
var interval = setInterval(function () {
var parag = document.getElementById("theParagraph");
parag.innerText = text.substr(0, i);
if (text.length == i)
clearInterval(interval);
i++;
}, 200)
}
Während die anderen Antworten sicherlich richtig sind und hilfreiche Informationen enthalten, brachte diese Antwort etwas Wichtiges zutage, das mir nicht einmal eingefallen ist. gj
– John Wu
12. Dezember 2017 um 10:31 Uhr
Gerardo Furtado
Was ist mit der Verwendung textContent?
var text = ["H", "e", "l", "l", "o", " ", "h", "o", "w", " ", "a", "r", "e", " ","y", "o", "u", "?"]
function typeText() {
var i = 0;
var interval = setInterval(function() {
var parag = document.getElementById("theParagraph");
var paragOldText = parag.textContent;
parag.textContent = paragOldText + text[i];
i++;
if (text.length == i)
clearInterval(interval);
}, 200)
}
innerText wurde von IE eingeführt und wie wir alle wissen, kommt nichts Gutes von IE. Scherz beiseite, das ist eine gute Erklärung dazu: “Der arme, missverstandene innere Text”.
Alles, was über Browserkompatibilität geschrieben wurde, veraltet heutzutage ziemlich schnell, auch FF hat sich angepasst innerText in letzter Zeit.
– Teemu
12. Dezember 2017 um 10:51 Uhr
Vielen Dank! das hat mir geholfen. aber es wäre besser, wenn Sie die Ursache nennen
Die anderen Antworten behandeln die Probleme mit Ihrem Code, aber ich möchte Probleme mit Ihrem gesamten Plan ansprechen.
Wollen Sie wirklich ein Array von Zeichen definieren? Lange Sätze werden die Hölle sein. Und was ist, wenn Sie variablen Text wünschen? Verwenden Sie stattdessen Folgendes:
var input = "Hello how are you?";
var text = input.split(""); // split into array of characters
Apropos längere Sätze, Ihre “Schreibmaschine” wird die aktuelle Zeile ausfüllen, erkennen, dass sie keinen Platz hat, und dann das letzte Wort in die nächste Zeile schieben, um es zu beenden. Das sieht nicht gut aus! Das kannst du mit einem cleveren Trick umgehen:
<p><span id="visible_text">Hello how a</span><span id="remaining_text">re you?</span></p>
<style>#remaining_text {visibility:hidden}</style>
Dadurch wird nicht nur der Zeilenumbruch sehr gut gehandhabt, sondern auch der erforderliche Platz im Voraus “reserviert”, damit Sie nicht damit enden, dass der Inhalt unter der Schreibmaschine weiter nach unten auf der Seite verschoben wird, wenn neue Zeilen entstehen.
Sie können diesen Effekt leicht erzielen, indem Sie zählen, an welcher Zeichenposition Sie sich befinden, und dann die Zeichen teilen input String in zwei Teile an diesem Versatz. Legen Sie das erste Stück in das erste <span>der Rest in der zweiten, und du bist goldrichtig.
Quelle: Ich verwende diese Technik in meinem Code im Stil einer “RPG-Zwischensequenz”. Eigentlich eine fortgeschrittenere Version, da meine auch HTML statt nur reinem Text unterstützt!
gurvinder372
Sie müssen das Leerzeichen mit einführen und verwenden innerHTML Anstatt von innerText
Ich habe Ihren Code geändert, um zu zeigen, wie Sie die verwenden können Slice-Methode für kürzeren, eleganteren Code.
var text = "Hello how are you?"
function typeText() {
var i = 0;
var parag = document.getElementById("theParagraph");
var interval = setInterval(function () {
i++;
parag.innerText = text.slice(0, i);
if (i == text.length)
clearInterval(interval);
}, 200)
}
Bitte beachten Sie auch, dass Konrad Rudolph und Bergi das Warum in Kommentaren direkt auf die Frage beantwortet haben.
Monilito Castro
Dieses Problem ist ein großartiger Kandidat für ein MVC-Muster. Ich bespreche genau dieses Problem in meinem bloggen. Ich habe unten ein MVC für dieses Problem bereitgestellt. (Bitte entschuldigen Sie die schamlose Eigenwerbung.)
<body>
<p id="theParagraph"></p>
<button id="typeButton" onclick="typeText()" style="padding:15px">Start typing the sentence</button>
<p>
I invite you to go to my <a target="_top" href="https://www.monilito.com/blog/Never-Use-Presentational-Structures-to-Store-State">blog article</a> for an interesting take on this problem.
</p>
</body>
Diese Lösung verkompliziert den Code unnötigerweise ohne Mehrwert, indem versucht wird, einen großen quadratischen Stift in ein kleines rundes Loch zu passen.
– d4nyll
10. Juni 2021 um 20:43 Uhr
14299300cookie-checkLeerzeichen werden von der InnerText-Eigenschaft ignoriertyes
Da keine der anderen Antworten erklären warum Ihr Code funktioniert nicht: Kurz gesagt, es liegt daran
innerText
stellt den gerenderten Text auf einer Seite dar, was bedeutet, dass der des Elements angewendet wirdwhite-space
Regeln. Der Effekt in Ihrem Fall ist, dass umgebende Leerzeichen entfernt werden.– Konrad Rudolf
12. Dezember 2017 um 10:40 Uhr
Schauen Sie sich den Unterschied zwischen Textinhalt und innerem Text und möglicherweise auch diesen an
– Bergi
12. Dezember 2017 um 14:36 Uhr
Lesen Sie Bergis Kommentar^
– Zack Plauché
24. Juni 2020 um 6:05 Uhr