2011-01-06 11 views
0

$ (': 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() 원하는 솔루션을 얻을 수 없었다 ..하지만 ...

어떤 제안과 시도했다. 미리 감사드립니다.

+0

당신이 참조하는'루프 내에서 Data'는 특정 인덱스를 검색해서는 안됩니다? '$ (': (# '+ Data [i] +') ').) 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는 string입니다. 분리 된 둘 이상의 문자열을 | 포함하고 있으며이 모든 값은 트리의 노드에 해당합니다. filterData에있는 노드를 숨기려고합니다. string.my 코드는 제 질문으로 작성되었습니다. 그러나 언제 나는 $ ('div : has (#'+ Data + ')')를 사용하고있다.) show(); , 그 다음 작동하지 않는다 – Vivek

1

는 짧은 대답은 :has를 사용하지 않는 것입니다있다; 같은 일을 성취 할 수있는 몇 가지 다른 빠른 방법이 있습니다. 어느 ID 또는 CSS 클래스하여 DOM의 요소를 선택할 때

$('#' + filterData) 또는 $('.' + filterData) 각각 단지 더 일반화 선택기의 오버 헤드없이 이러한 :has로 할 것이다.

특정 문제를 해결하려면 $()에 여러 셀렉터를 쉼표로 구분하여 전달할 수 있습니다. 예를 들어

는 :

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

또는,'var filtered = $ ("#"+ Data.join (", #")); –

관련 문제