2013-03-21 7 views
13

Sono stato indirizzato al progetto Linkify su GitHub (https://github.com/cowboy/javascript-linkify) per trovare e "collegare" URL e domini semplicemente fluttuanti nel testo.Sostituisci un textNode con testo HTML in Javascript?

È fantastico! Funziona totalmente sul testo!

Tuttavia, non sono abbastanza sicuro su come farlo funzionare su un textNode che ha il testo che voglio collegare.

Capisco che textNode ha solo testoContent da .. è tutto testo. Poiché questa funzione di Linkify restituisce HTML come testo, c'è un modo per prendere un textNode e "riscrivere" l'HTML al suo interno con l'output di Linkify?

ho giocato con esso su JSFiddle qui: 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); 
    } 
} 
} 
+1

Il tuo codice di esempio è così disordinato e così tanto che non so nemmeno da dove cominciare! Puoi pulirlo un po 'e avere solo un esempio normale e quello che vuoi con textNode? –

+4

http://jsfiddle.net/AMhRK/4/ – Ryan

+0

@ryan è vicino ma lo vedi distrugge gli URL già correttamente linkati. – Jippers

risposta

14

sarà necessario sostituire il TextNode con un elemento HTML, come un arco, e quindi impostare il vostro linkified-testo come quell'elemento di innerHTML.

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

Non è così semplice come un nodo di testo può contenere molti elementi "non linkati" –

+0

Questo sembra funzionare! Ecco una forchetta di Fiddle con l'aggiunta di Will Scott: http://jsfiddle.net/H2aHH/ – Jippers

+0

mantiene la 'Selection' dell'utente, dove' .replaceChild() 'no !! brillante – neaumusic

2

In aggiunta alla risposta precedente propongo modo più breve (sulla base di jQuery):

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

dove n - è TextNode.

+1

'ReplaceWith()' è disponibile come [vaniglia JavaScript] (https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/replaceWith) sul browser moderni (Chrome e Firefox; EDGE è sotto sviluppo). –