4

さらにサブセレクションを実行できるように、jQuery セレクションを再利用したいと考えています。これは私の例です:

if ($('#thisId > .thatClass').length > 0) {
    return $('#thisId > .thatClass > a.thatOtherClass').attr('id');
}

セレクションを多用するので、(少なくとも読みやすさの理由から) コードを次のように短くしたいと思います。

var selection = $('#thisId > .thatClass');
if (selection.length > 0) {
    var furtherSelection = selection.filter('> a.thatOtherClass');
    return furtherSelection.attr('id');
}

これを試してみると、エラーが発生します:

TypeError: FurtherSelection.attr(...) は定義されていません

明らかに私は何か間違っている、多分誰かが考えを持っていますか?

4

2 に答える 2

6

children()代わりに私たち...

var selection = $('#thisId > .thatClass');
if (selection.length > 0)
{
    return selection.children('a.thatOtherClass').attr('id');
}

children()セレクターでの使用は推奨されないという事実のために使用しました>(以下のコメントに従って)。

子要素を特に探していない場合は、次のfind()ように使用できます...

var selection = $('#thisId > .thatClass');
if (selection.length > 0)
{
    return selection.find('a.thatOtherClass').attr('id');
}
于 2012-12-04T14:29:18.933 に答える
1

.children()アーチャーが提案するように代わりに使用できます。しかし、根本的な問題は、あなたが.filter意味するときに使用していることです.find("> a.thatOtherClass")Archer はこれをほのめかしていますが、ベスト プラクティス以外にあなたの構成に問題はなかったことを理解することが重要です。

filterDOM ツリーをトラバースしません。同じ DOM レベルで、現在のシーケンスから要素を削除します。だから、あなたがこれを書いたとき:

var furtherSelection = selection.filter('> a.thatOtherClass');

あなたは本当に「'#thisId > .thatClass' AND ALSO '> a.thatOtherClass'を満たす要素」と言っていました。したがって.thatClass、子をテストする必要があるときに、中間要素をテストしていました。代わりにfindorを使用した場合は、次のように機能します。children

var furtherSelection = selection.find('> a.thatOtherClass');   //works
var furtherSelection = selection.children('a.thatOtherClass'); //also works

jsFiddle でこれらの動作を参照してください: http://jsfiddle.net/jmorgan123/S726f/

.filterこれを指摘しているのは、との違い.findが非常に重要であるためです。実際の問題は、この 2 つを混同していたことです。

于 2012-12-04T19:02:58.723 に答える