2011-01-06 21 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' внутри цикла не должны вы быть получение конкретного индекса? - '$ (': has (#' + Data [i] + ')'). show();' – James

+0

yes thats fine ... я пропустил это, набрав здесь, но в фактическом коде это нормально – Vivek

ответ

0

Попробуйте это: 1) Удалены проверка на ненужным filterData прежде, чем разделить
2) Старинная строку filterData на селектор JQuery, чтобы избежать цикла. 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 + ')'). show(); , то его не работает – Vivek

1

Короткий ответ не использовать :has; есть несколько других, более быстрых способов сделать то же самое.

При выборе элементов из DOM либо ID или класса CSS, $('#' + filterData) или $('.' + filterData), соответственно, будет делать только, что без каких накладных расходов более обобщенного селектора, таких как :has.

Чтобы решить вашу проблему, полезно отметить, что несколько селекторов можно передать в $(), разделив их запятыми.

Например:

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

Или, 'var filter = $ (" # "+ Data.join (", # "));' –

Смежные вопросы