2011-01-06 102 views
0

我有以下HTML多個選擇不似乎工作

<div id="finalTree"> 
<ul> 
<li class="last" style="display: list-item;"> 
<a id="DataSheets" href="#">Data Sheets</a> 
</li></u>...........</div> 

,我第一次隱藏所有這些力,然後試圖證明那些李其匹配選擇。這是我的JavaScript。這裏filterData是鏈接的ID。

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

    }else{ 

     $('#'+filterData+).show(); 
    } } 

最後兩行不工作... 任何人能告訴我什麼可以是可能的原因。其實我試圖用:has, :contains, find().filter()來顯示li,但是如果我有大樹,所有這些花費太多時間。

我試圖通過使用多個選擇器來顯示它,但它沒有顯示任何東西。任何有更快的方式來展示它的替代方案將受到高度讚賞。

回答

2

你(除了語法錯誤是什麼@verrerby提到)應該正在工作,但爲什麼不減少該代碼?

您可以通過在.join()的第一個元素之後的每個元素上添加#來簡化操作,這也極大地簡化了邏輯。你可以減少它歸結爲:

function filterLeftNavTree(filterData) { 
    $("ul.treeview li").hide(); 
    $('#'+filterData.split('|').join(',#')).show(); 
} 

還要注意的變更而移除.find(),它在支持它使用一個單一的選擇,同樣快的所有其他瀏覽器快。

唯一的其他可能原因,我看到你的代碼不工作時用於隱藏jQuery$是在演出中,是否有可能$指的是什麼東西? (例如ptototype?)爲了測試,只需在.show()調用上將$替換爲jQuery即可。

1

你必須在最後的陳述額外+',你可以做到這一點在多條語句,而不是之一(#{id}選擇是非常快的):

if(filterData.indexOf("|")!=-1){ 
    var filterData = filterData.split("|"); 
    for(i=0;i<filterData.length;i++){ 
     $('#'+filterData[i]).show(); 
    } 

}else{ 

    $('#'+filterData).show(); 
} 
+0

那個+輸入錯誤我也試過這個代碼之前...但是迴應相同。同時在loop.it中顯示需要更多時間。性能問題 – Vivek 2011-01-06 12:15:30

+0

您確定需要更多時間嗎?我懷疑jQuery會在幕後做幾乎相同的事情。如果這不起作用,你有沒有試過檢查你的filterData列表,因爲我不明白爲什麼這不起作用的任何原因。 – veggerby 2011-01-06 12:27:52