In primo luogo, hai bisogno di un modo per accedere al paragrafo. Si potrebbe voler dare un attributo id
, come ad esempio "pippo":
<p id="foo">Lorem Ipsum <a href="#">Link</a> <div ... </div> </p>
Quindi, è possibile utilizzare document.getElementById
per accedere a tale elemento e sostituire i suoi figli come richiesto:
var p = document.getElementById('foo'),
firstTextNode = p.firstChild,
newSpan = document.createElement('span');
// Append "Lorem Ipsum" text to new span:
newSpan.appendChild(document.createTextNode(firstTextNode.nodeValue));
// Replace old text node with new span:
p.replaceChild(newSpan, firstTextNode);
Per rendere più più affidabile, è possibile chiamare p.normalize()
prima di accedere al primo figlio, per garantire che tutti i nodi di testo prima dell'ancoraggio vengano uniti come uno.
Oook, Così si vuole sostituire una parte di un nodo di testo con un elemento. Ecco come lo farei:
function giveMeDOM(html) {
var div = document.createElement('div'),
frag = document.createDocumentFragment();
div.innerHTML = html;
while (div.firstChild) {
frag.appendChild(div.firstChild);
}
return frag;
}
var p = document.getElementById('foo'),
firstChild = p.firstChild;
// Merge adjacent text nodes:
p.normalize();
// Get new DOM structure:
var newStructure = giveMeDOM(firstChild.nodeValue.replace(/Lorem Ipsum/i, '<span>$&</span>'));
// Replace first child with new DOM structure:
p.replaceChild(newStructure, firstChild);
Lavorare con i nodi al livello basso è un po 'una brutta situazione di essere in; soprattutto senza alcuna astrazione per aiutarti. Ho cercato di mantenere un senso di normalità creando un nodo DOM da una stringa HTML prodotta dalla frase "Lorem Ipsum" sostituita. I puristi probabilmente non amano questa soluzione, ma la trovo perfettamente adatta.
EDIT: Ora utilizzando un frammento di documento! Grazie Crescent Fresh!
Ma, ma ... dove si trova la * ricerca * (e si sposta nel punto corrispondente all'interno di 'firstTextNode') per" Lorem Ipsum "? –
Ah, ho trascurato questo, lavorando ora. – James
@ J-P: il mio upvote attende la modifica !! –