1

似たようなタイトルの質問を見たことがありますが、まったく同じではありません。

まず、YUI (Liferay 6.0 との互換性のために 3.2.0) を使用しています。

私はすでにNode参照を持っています。Node私の目標は、特定の CSS セレクターに一致する最初の子を取得することです。最初に、私はこれをしていました:

...
parse: function(node) {
    var title = node.one('>span, >div, >a, >h1');
    ...
},
...

これは Firefox、Chrome、IE 9 以降で動作します。ただし、IE 8 をサポートする必要があります。

子セレクターは、">" で区切られた2 つ以上のセレクターで構成されます。

これは、実際にはそうではないように見えますが、仕様に従って、親が必要であることを示しているようです。そこで、もう少し調べてみると、jQuery が実際にこの特定のケースが非推奨になっていると言及していることがわかります。

注: $("> elem", context) セレクターは、将来のリリースで廃止される予定です。したがって、代替セレクターを使用する代わりに、その使用はお勧めできません。

このケースについて YUI のドキュメントで明示的に言及されているのを見つけることはできませんが、それでも安全に使用できるとは思えません (とにかく IE8 ではサポートされていません)。*>span, *>div, ...、 を使用するなど、さまざまなことを試しました*:first-child+span, ...が、うまくいきませんでした。だから私が残っているのはこれです:

var title = node.get('children').filter('>span, >div, >a, >h1').item(0);

しかし、背後にあるコードには多くのループがあるため、これは洗練されておらず非効率的です (フィルターは短絡せず、最初の一致だけが必要なため)。誰にもより良い提案がありますか?

4

1 に答える 1

2

この場合、一歩後退するのが理にかなっているかもしれません。現在、要件は「この CSS セレクターに一致させる」という枠組みになっています。代わりに、「スパン、div、アンカー、または h1 であるこのノードの最初の子を取得する」(または同様の何か) としてフレーム化できますか?

もしそうなら、セレクターエンジンを捨ててください。代わりに、 node.get('children') を呼び出してから、結果の NodeList を反復処理します。反復子関数は、ノード名が正しい値であるかどうかを確認し、正しい値であれば短絡するだけです。これにより、安定したパフォーマンスが得られ、かなり読みやすくなるはずです。

于 2012-12-17T23:25:26.010 に答える