En primer lugar, necesitas alguna forma de acceder al párrafo. Es posible que desee darle un atributo id
, tales como "foo":
<p id="foo">Lorem Ipsum <a href="#">Link</a> <div ... </div> </p>
A continuación, puede utilizar document.getElementById
acceder a ese elemento y reemplazar sus hijos según sea necesario:
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);
Para que sea más confiable, es posible que desee llamar al p.normalize()
antes de acceder al primer hijo, para asegurarse de que todos los nodos de texto antes del delimitador se fusionen como uno solo.
Oook, por lo que desea reemplazar una parte de un nodo de texto con un elemento. Así es como yo lo haría:
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);
Trabajar con nodos en el nivel bajo es un poco de una situación desagradable para estar en; especialmente sin ninguna abstracción para ayudarte. Intenté mantener la sensación de normalidad creando un nodo DOM a partir de una cadena HTML producida a partir de la frase reemplazada "Lorem Ipsum". Los puristas probablemente no les gusta esta solución, pero la encuentro perfectamente adecuada.
EDITAR: Ahora, utilizando un fragmento de documento! Gracias Crescent Fresh!
Pero, pero ... ¿dónde está la * búsqueda * (y mover al punto coincidente dentro de 'firstTextNode') para" Lorem Ipsum "? –
Ah, lo pasé por alto, trabajando en eso ahora. – James
@ J-P: mi upvote espera su edición !! –