Замена HTML приведет к тому, что обработчики событий не будут связаны, а замена всего текста для элемента приведет к потере разметки HTML.Лучший подход - оставить любой HTML нетронутым, манипулируя только первым текстовым узлом соответствующего элемента.Чтобы получить этот текстовый узел, вы можете использовать .contents()
и .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/>');
};
Рабочая демонстрация: http://jsfiddle.net/9AXvN/
Использование этого метода гарантирует, что манипулирование первым словом не будет иметь нежелательных побочных эффектов для остальной части содержимого элемента.
Вы можете легко прикрепить это как расширение к jQuery с необязательным значением для количества слов, которое вы хотите заключить:
$.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/>');
};
Рабочая демонстрация: http://jsfiddle.net/9AXvN/1/