Al reemplazar HTML, los controladores de eventos se liberarán y reemplazar el texto completo de un elemento provocará la pérdida de la marca HTML. El mejor enfoque deja intacto cualquier HTML, manipulando solo el primer nodo de texto del elemento coincidente. Para conseguir que el nodo de texto, puede utilizar .contents()
y .filter()
:
function wrapFirstWord() {
// Select only the first text node
var node = $("div").contents().filter(function() {
return this.nodeType == 3;
}).first(),
// Get the text...
text = node.text(),
// ... and the first word
first = text.slice(0, text.indexOf(" "));
if (!node.length)
return;
// Remove the first word from the text
node[0].nodeValue = text.slice(first.length);
// Add it back in with HTML around it
node.before('<span>' + first + '</span><br/>');
};
demostración de trabajo: http://jsfiddle.net/9AXvN/
Usando este método se asegurará de que la manipulación de la primera palabra no tendrá efectos secundarios no deseados en el resto de el contenido del elemento.
Usted puede virar fácilmente esta en como una extensión de jQuery, con un valor opcional para el número de palabras que quieres para envolver:
$.fn.wrapStart = function (numWords) {
var node = this.contents().filter(function() {
return this.nodeType == 3
}).first(),
text = node.text(),
first = text.split(" ", numWords).join(" ");
if (!node.length)
return;
node[0].nodeValue = text.slice(first.length);
node.before('<span>' + first + '</span><br/>');
};
demostración de trabajo: http://jsfiddle.net/9AXvN/1/
+1 hombre ¡Llegué 1 minuto tarde! Solo hice lo mismo. http://jsfiddle.net/markcoleman/NdhSj/ –
Gracias @Andy E, no estoy seguro de si estoy siendo lento, pero ¿cómo puedo especificar cuántas palabras están incluidas? – Evans
@jdln, puede especificar el número de palabras en la llamada wrapStart(). '$ (" div "). wrapStart (2);'.Además, debes aceptar esta respuesta en lugar de la mía, ya que definitivamente es una mejor manera :) – Dogbert