2010-11-02 46 views
3


我開發了一些成果的一個javascript過濾,並有一定的困難..
這裏的問題是...
假設我們有一些標準的邏輯問題,尋求一種算法

  1. Manufacter (Trusardi,卡爾文KEIN,阿瑪尼......)
  2. 顏色(紅,藍,黑......)
  3. OtherFeatures(GORETEX,等等,等等...)

每個功能顯示爲複選框...
問題是我想禁用複選框,如果它的選擇將導致沒有結果..例如阿瑪尼的產品可能只有藍色,所以檢查阿瑪尼應該禁用黑色和紅色,但其他manufactors不應該被禁止......作爲檢查他們應該提供一個結果...
這裏是到目前爲止的代碼

results = $("#products li"); 
results.hide(); 
var filtersGroup = $("#filters li.filtersGroup"); 

$("#filters li.filtersGroup a").removeClass("disabled"); 
filtersGroup.each(function(index) { 
    var classes = ""; 

    $(this).find("a.checked").each(function(index) { 
     classes = classes + "." + $(this).attr("id") + ","; 
    }); 
    if (classes == "") return true; 

    results = results.filter(classes.substr(0, classes.length - 1)); 
    //periorismos 
    filtersGroup.not($(this)).each(function(index) { 
     $(this).find("a").each(function(index) { 
      if (results.filter("." + $(this).attr("id")).length <= 0) { 
       $(this).removeClass("checked").addClass("disabled"); 
      } 
     }); 
    }); 
}); 

雖然它過濾他們成功,失效總不是正確的。例如重現問題,如果你選擇所有的製造商,然後選擇一種顏色製造商將被禁用,但顏色不是在第一次..
我想一個解決方案是創建多個結果,將模擬所有下一個可能的檢查(如果16個特徵和4個檢查意味着12個可能的其他檢查..
但我認爲這種方法很糟糕......任何其他想法?

回答

1

您可以爲每個製造商,顏色等添加一個類,然後簡單地按類禁用。我認爲這裏有一個結果哈希鍵關閉製造商:

results['Trusardi'] = 5 
results['Armani' = 0 

..then:

$("#filters li.filtersGroup a").addClass("disabled"); 
foreach (m in manufacturers) { 
    if (manufacturers[m] > 0) { 
     $("#filters li.filtersGroup a." + m).removeClass("disabled"); 
    } 
} 

0

我認爲我找到了解決辦法。它比我想象......我嘗試了一整天找到一個解決長期簡單,它比我想象的更簡單.. 這....

results=$("#products li"); 
      results.hide(); 
      var groupClasses=[]; 
      var groupsChecked=0; 

     var filtersGroup=$("#filters li.filtersGroup"); 

     $("#filters li.filtersGroup a").removeClass("disabled"); 
     filtersGroup.each(function(index) { 
      var classes=""; 

      $(this).find("a.checked").each(function(index) { 
       classes=classes+ "." + $(this).attr("id") +","; 
      }); 

      groupClasses[groupClasses.length]=classes; 
      if(classes=="") return true; 
      groupsChecked++; 
      results=results.filter(classes.substr(0,classes.length-1)); 

     }); 
     //disable 
     var gi=0; 
     filtersGroup.each(function(index) { 
      if(! (groupsChecked<=1 && groupClasses[gi]!="")) 
       { 
        $(this).find("a").not(".checked").each(function(){ 
         if (results.filter("." + $(this).attr("id")).length <= 0) { 
          $(this).removeClass("checked").addClass("disabled"); 
         } 
        }); 
       } 

      gi++; 
     }); 

這似乎是正確的。我不確定,但測試它似乎確定..

0

你就不能計算結果爲每選中選項,並比較它們到現在的產品就夠了。 (我不是很熟悉jQuery,所以我不知道如何......)