2011-01-06 18 views
0

私は$( ':has')を使用してツリーをフィルタリングしています。うまく動作していますが、正確な一致を見つけるには時間がかかりすぎています...:hasは正常に動作していません

function filterLeftNavTree(filterData){ 
    jQuery("ul.treeview").find("li").hide(); 
    if(filterData.indexOf("|")!=-1){ 
    var Data = filterData.split("|"); 
    for(i=0;i<Data.length;i++){ 
    $(':has(#'+Data[i] +')').show(); 
    } 
    }else{ 
    $(':has(#'+filterData+')').show(); 
    } } 

私は が、それは完全な一致を示していない...スピードを向上させるために$('div:has(#'+Data +')').show();を使用しています...
私が何か間違ったことをやっていますか...?私はこのコードのパフォーマンスを向上させることができるように
は、私はまた、.find()所望の解を得ることができませんでした..but ...

任意の提案を試みました。 ありがとうございます。

+0

参照? show(); ' – James

+0

はいいいえ...私はここに入力している間にそれを見逃しましたが、実際のコードではそれは大丈夫です – Vivek

答えて

0

これを試してみてください:filterData上に、不要なチェックを削除し 1))
2分割する前にループを避けるために、jQueryのセレクタにfilterData文字列にコンバート。 3)を添加し、セレクタが含まれている代わりに

function filterLeftNavTree(filterData){ 
    jQuery("ul.treeview").find("li").hide(); 
    var Data = filterData.replace("|", "), :contains("); 
    $(':contains('+ Data +')').show(); 
} 
+0

実際にfilterdataは文字列です|で区切られた複数の文字列を含んでおり、これらの値はすべてツリー内のノードに対応しています。filterDataにあるノードを非表示にしようとしていますstring.myコードは問題なく書かれています。私は$( 'div:has(#' + Data + ')')を使用しています。 、それが動作していない – Vivek

1

短い答えは:hasを使用するのではないを有します。同じことを達成するためのいくつかの他の高速な方法があります。いずれかのIDまたはCSSクラスによってDOMから要素を選択する場合

$('#' + filterData)

又は$('.' + filterData)、それぞれ、ちょうどそのより一般セレクタのオーバーヘッドを招くことなく、そのような:hasのように行います。

特定の問題を解決するには、複数のセレクタをカンマで区切って$()に渡すことができます。例えば

:あなたは `ループ内Data`を使用すると、特定のインデックスを取得するべきではありません

var selectors = []; 
for(i=0;i<Data.length;i++){ 
    selectors.push('#'+Data); 
} 
var filtered = $(selectors.join(',')); 
+0

または、 'var filtered = $("# "+ Data.join("、# "));' –

関連する問題