Ersetzen Sie einen textNode mit HTML-Text in Javascript?

Lesezeit: 3 Minuten

Benutzeravatar von Jippers
Jippers

Ich wurde zum Linkify-Projekt auf GitHub weitergeleitet (https://github.com/cowboy/javascript-linkify) zum Finden und “Verlinken” von URLs und Domains, die einfach im Text schweben.

Es ist toll! Es funktioniert total auf Text!

Allerdings bin ich mir nicht ganz sicher, wie ich es bei a zum Laufen bringen soll textNode die den Text enthält, den ich verlinken möchte.

Ich verstehe die textNode hat nur textContent seit … es ist alles Text. Da diese Linkify-Funktion HTML als Text zurückgibt, gibt es eine Möglichkeit, einen textNode zu nehmen und den darin enthaltenen HTML-Code mit der Linkify-Ausgabe “umzuschreiben”?

Ich habe hier auf JSFiddle damit gespielt: http://jsfiddle.net/AMhRK/9/

function repl(node) {
  var nodes = node.childNodes;
  for (var i = 0, m = nodes.length; i < m; i++) {
    var n = nodes[i];
    if (n.nodeType == n.TEXT_NODE) {
      // do some swappy text to html here?
      n.textContent = linkify(n.textContent);
    } else {
      repl(n);
    }
  }
}

  • Ihr Beispielcode ist so chaotisch und so viel, dass ich nicht einmal weiß, wo ich anfangen soll! Können Sie es ein wenig aufräumen und nur ein normales Beispiel haben und das gewünschte mit textNode?

    – Hanlet Escaño

    21. März 2013 um 16:50 Uhr


  • jsfiddle.net/AMhRK/4

    – Ryan

    21. März 2013 um 17:05 Uhr

  • @ryan es ist nah, aber Sie sehen, dass es die bereits richtig verlinkten URLs verstümmelt.

    – Jippers

    21. März 2013 um 17:28 Uhr

  • @HanletEscaño hier ist eine “aufgeräumte” Geige jsfiddle.net/AMhRK/6

    – Jippers

    21. März 2013 um 17:39 Uhr

  • @Jippers hast du Ryans jsFiddle ausprobiert? Es funktioniert tatsächlich.

    – Hanlet Escaño

    21. März 2013 um 17:40 Uhr

Sie müssen textNode durch ein HTML-Element ersetzen, z. B. eine Spanne, und dann Ihren verknüpften Text als innerHTML dieses Elements festlegen.

var replacementNode = document.createElement('span');
replacementNode.innerHTML = linkify(n.textContent);
n.parentNode.insertBefore(replacementNode, n);
n.parentNode.removeChild(n);

  • Es ist nicht so einfach, da ein Textknoten viele “nicht verknüpfte” Elemente enthalten kann

    – Rodrigo Siqueira

    21. März 2013 um 17:12 Uhr

  • Das scheint zu funktionieren! Hier ist eine Fiddle-Fork mit Will Scotts Ergänzung: jsfiddle.net/H2aHH

    – Jippers

    21. März 2013 um 18:18 Uhr


  • dies behält die des Benutzers bei SelectionWo .replaceChild() nicht!! brillant

    – Neumusik

    17. Mai 2016 um 0:55 Uhr

  • var replacementNode = document.createElement(‘span’); var newHtml = linkify(n.textContent); n.parentNode.insertBefore(replacementNode, n); n.parentNode.removeChild(n); ReplacementNode.outerHTML = newHtml;

    – Gromo

    15. März 2019 um 11:04 Uhr


  • @Gromo Ich mag deine Lösung, da sie nicht neu bleibt span Elemente herum.

    – Gabriel Luci

    3. Juni 2019 um 16:02 Uhr

Benutzeravatar von IStranger
Fremder

Zusätzlich zur vorherigen Antwort schlage ich einen kürzeren Weg vor (basierend auf jQuery):

$(n).replaceWith('Some text with <b>html</b> support');

Wo n – ist textNode.

Oder der native Version

var txt = document.createElement("span");
txt.innerHTML = "Some text with <b>html</b> support";
node.replaceWith(txt);

Wo node ist der textNode

  • replaceWith() ist verfügbar als Vanille-JavaScript auf modernen Browsern (Chrome und Firefox; Edge befindet sich in der Entwicklung).

    – Franklin Yu

    31. Oktober 2017 um 18:20 Uhr


  • Aber in der Vanilla-Version gibt es keine HTML-Unterstützung. Tags erscheinen nur als Text.

    – Kokodoko

    14. Dezember 2018 um 13:02 Uhr

Bauen Sie auf der Antwort von @AlexJeffcott auf: Verwendung der perf-optimierten Version DokumentFragment anstatt herumzuspielen <span>innerHTML und childNodes😁

const enhanceNodes = (textNodes) => {
    textNodes.forEach((node) => {
        const oldText = node.textContent;
        const newText = fancyTextTranformation(oldText);
        const fragment = document.createRange().createContextualFragment(newText);
        node.replaceWith(fragment);
    })
}

Aufbauend auf der akzeptierten Antwort von Will Scott können Sie Folgendes tun, wenn Sie nicht alles in eine Spanne packen möchten:

const enhanceNodes = (textNodes) => {
    const renderNode = document.createElement('span');
    textNodes.forEach((node) => {
        const oldText = node.textContent;
        renderNode.innerHTML = fancyTextTranformation(oldText);
        node.replaceWith(...renderNode.childNodes);
    })
}

1445310cookie-checkErsetzen Sie einen textNode mit HTML-Text in Javascript?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy