• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Fehlerhafte Maskier-Funktion für HTML-spezifische Zeichen

Status
Für weitere Antworten geschlossen.

JensB

Neues Mitglied
Hallo,

ich habe mir diese kleine Funktion geschrieben:
Code:
function maskiere (s) {
    return s.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/&/g, "&amp;");    
}

Ich brauche sie, weil ich mir eine rudimentäre Javascript-Suche in die HP einbauen will, und ich zeige den Suchbegriff via
Code:
document.getElementById('blubb').innerHTML = KEYWORD;
an, und ich will durch die maskiere()-Funktion erreichen, dass kein HTML-Code eingefügt werden kann. Das Element mit der id 'blubb' ist ein <span>.

Problem: Es werden nach der maskiere()-Funktion die fraglichen Zeichen (<, >, &) nicht dargestellt, sondern ihre Entsprechungen &lt; &gt; &amp; Warum?

Ich wollte ja erreichen, dass diese trotzdem angezeigt werden, nur durch die Maskierung mit &lt; etc. nicht als HTML-Tags ausgewertet werden.

Gruß
Jens
 
Wenn es jemanden interessiert, hier der Fehler: Die Replace-Funktion der Ampersands (&) muss ZUERST ausgeführt werden, sonst werden auch die &s in den &lt; etc. umgewandelt. Hier der korrekte Code:
Code:
function maskiere (s) {
    return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")
}

Gruß
Jens
 
Wenn du document.getElementById('blubb').firstChild.nodeValue = "<html>"; benutzt hättest du so eine Funktion gar nicht gebraucht.
 
Es gibt deshalb keine Maskierfunktion in JavaScript, weil man keine braucht. HTML-Elemente erzeugt man mit DOM-Methoden, Text bleibt dabei Text. Bei innerHTML wird der Text vorher geparsed und ist somit eine Ausnahme.
 
Gut, dass man in Javascript keine braucht. Warum auch? ;-)

Beispiel: Ich hab ein Textfeld, da gibt jemand einen böswilligen Suchbegriff ein, der HTML-Tags enthält. Ich als Gutgläubiger Homepage-Inhaber sage irgendwo ganz naiv:
Code:
meineDiv.innerHTML = "Suchbegriff: <u>" + keyword + "</u>";
und ZACK steht da der HHTML Code auf meiner Seite, und upps, das wollte ich jar gar nicht.

Da braucht man also keine Maskier-Funktion?
 
Bei innerHTML schon, das sagte ich aber und geredet habe ich von DOM-Methoden zur Manipulation von XML/HTML-Dokumenten. Wenn man kein HTML mit innerHTML einfügen will, hat es auch keinen Zweck innerHTML zu benutzen.
 
document.all sollte man nicht verwenden. Zwar können es alle Browser, aber es ist nicht standardisiert. Das selbe gilt somit für innerText.
 
@crash: Dann habe ich dich missverstanden weiter oben, nichts für Ungut.

@all: Ja, innerText wäre eine Alternative, ist aber so wie ich weiß nicht gerade überall supported. Das innerHTML hingegen läuft fast überall, aber auch nicht soo hundert prozentig perfekt... Habe jetzt nach googlen eine "Misch"lösung zwischen DOM und innerHTML gefunden, die gut funktioniert (innerHTML alleine ist bei mir eine Variable):

Code:
    // erzeuge <div>[results]</div>
    var resultsDiv = document.createElement("div");
    resultsDiv.innerHTML = innerHTML;
    container.appendChild(resultsDiv);
 
Ich weiß nicht was gegen meine Variante spricht, wie oben bereits erwähnt.

HTML:
var resultsDiv = document.createElement("div");
    resultsDiv.appendChild(
        document.createTextNode('<b>foo</b> <script src="foobar.js"></script>')
    );
    container.appendChild(resultsDiv);
 
Na weil dann die HTML-Steuerzeichen irgendwie nicht ausgewertet werden, weil du ja einen TEXT-node erstellst, so wie ich das sehe.
 
Du hast Recht, das wollte ich. Ich habe mir die Suchergebnisse allerdings inzwischen auch mit DOM-Methoden ausgeben lassen, und die Suchergebnisse schreibe ich in eine Tabelle, und da brauche ich logischerweise HTML, daher die Verwirrung ;-)
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben