5

getSelection 範囲から返されたテキスト ノード (node.nodeType == 3) を取得しています。

var selectionRange = selection.getRangeAt(0);
var startContainer = selectionRange.startContainer;

この startContainer は通常、次の html などのテキスト ノードです。

<p>Paragraph in <u>parag</u>raph.</p>

テキスト「raph」を含むテキスト ノードが生成されます。|場合 | 選択を示します:

<p>Paragraph in <u>parag</u>r|aph|.</p>

そうです、選択されたテキストは aph であり、テキスト ノードは raph. です。なぜなら、raph の前に u ノード内に新しいテキスト ノードがあるからです。

ここで、呼び出したときに、$(startContainer).prevAll().each(function(index, node) ... これが U (parag を含むテキスト ノードを含む) と別のテキスト ノード (Paragraph in を含む) を返すことを期待していました。

ただし、U のみが返され、その左側のテキスト ノードは返されません。

どうしてこれなの?jQuery を使用したテキスト ノードを含め、startContainer の前にすべての同じレベルのノードを取得するにはどうすればよいですか?

4

2 に答える 2

6

私が受け入れた答えであるPointyのおかげで、私は次のことを思いつきました:

var left = true;
                        var leftNodes = [];
                        var rightNodes = [];
                        $(startContainer).parent().contents().each(function(index, node) {
                            if (!left) { //right
                                rightNodes.push(node);
                            }
                            else if ((node.isSameNode(startContainer)) && (left)) {
                                left = false;
                            }
                            else { //left
                                leftNodes.push(node);
                            }
                        });
于 2010-10-19T13:38:01.907 に答える
4

一般に、jQuery はDOMの要素を操作するためのものです。特に「DOMナビゲーション」関数のファミリーでは、テキストノードを無視するのは面倒です(ほとんどの場合、.text()関数は明らかな例外です) 。

これは、テキストノードを見つけるためのコードをまとめるのに役立つかもしれない古い Stackoverflow の質問ですその質問でわかるように、jQuery.contents()関数にはテキスト ノードが含まれています。したがって、テキストノードの親に移動してその内容を取得し、その子のセットから「自分自身を見つけて」すぐ近くにあるノードを特定するなどのことができます。

于 2010-10-19T13:18:44.663 に答える