要素の内部テキストだけをラップする方法を見つけようとしていますが、他の内部DOM要素をターゲットにしたくありません。例えば。div内のアンラップされたテキストをターゲットにするためにJQueryを使用する
<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>
私は社内の木構造ui要素を作成する必要がありますので、これを表すためにUL構造を使用しています。しかし、私は開発者がウィジェットを使用するために特別なフォーマットを行う必要はありません。
update:私はちょうどこの目的を追加したいのですが、私はliの下にある要素を展開できるようにクリックリスナーを追加したいと思います。しかし、これらの要素はli内にあるので、クリックリスナーは子どもをクリックするので、代わりにテキストに添付したいので、これを行うにはテキストをターゲットに設定する必要があります。そのため、私はそれを自分のdivにラップしたいのです。
これまでのところ、divの中のliのすべての内側要素をラップし、元の親にすべての内側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"));
});
: 私はFYI私は、それは他のブラウザでテストされていないですので、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'>");
}
});
私は解答の修正版を持って行きました。フィルタ(function(){return this.nodeType == 3;}); '$(elem).contents() –