Я пытаюсь найти способ обернуть только внутренний текст элемента, я не хочу предназначаться для любых других внутренних элементов dom.Например.
<ul>
<li class="this-one">
this is my item
<ul>
<li>
this is a sub element
</li>
</ul>
</li>
</ul>
Я хочу использовать jQuery для этого.
<ul>
<li class="this-one">
<div class="tree-item-text">this is my item</div>
<ul>
<li>
<div class="tree-item-text">this is a sub element</div>
</li>
</ul>
</li>
</ul>
Небольшой фон - мне нужно создать собственный элемент пользовательского интерфейса в виде древовидной структуры, поэтому я 'м, используя структуру UL, чтобы представить это.Но я не хочу, чтобы разработчикам приходилось делать какое-либо специальное форматирование для использования виджета.
update: я просто хотел добавить цель этого, я хочу добавить прослушиватель щелчков, чтобы иметь возможность расширятьэлементы под li, однако, поскольку эти элементы находятся внутри li, прослушиватель щелчков будет активирован даже при нажатии на дочерние элементы, поэтому вместо этого я хочу прикрепить его к тексту, для этого текст должен быть нацеленным, поэтомуЯ хочу обернуть это в свой собственный div.
До сих пор я придумал оборачивать все внутренние элементы li в div и затем перемещать все внутренние элементы dom обратно к исходному родителю.Но этот код довольно тяжел для чего-то, что может быть намного проще и не требует больших манипуляций с DOM.
РЕДАКТИРОВАТЬ: хочу поделиться первой псевдо-альтернативой, которую я придумал, но я думаю, что это очень сложная задачахочу выполнить.
var innerTextThing = $("ul.tree ul").parents("li").wrapInner("<div class='tree-node-text'>");
$(innerTextThing.find(".tree-node-text")).each(function(){
$(this).after($(this).children("ul"));
});
Ответ: Я закончил тем, что сделал следующее, к вашему сведению, мне остается только беспокоиться о совместимости с FF и IE, поэтому он не тестировался в других браузерах.
//this will wrap all li textNodes in a div so we can target them.
$(that).find("li").contents()
.filter(function () {
return this.nodeType == 3;
}).each(function () {
if (
//these are for IE and FF compatibility
(this.textContent != undefined && this.textContent.trim() != "")
||
(this.innerText != undefined && this.innerText.trim() != "")
) {
$(this).wrap("<div class='tree-node-text'>");
}
});