2013-06-18 39 views
0

以前我問如何做到這一點,並引導到這一點:過濾只有先前未<select>選項qith JQuery的

<script> 
jQuery.fn.filterByText = function(textbox) { 
    return this.each(function() { 
     var select = this; 
     var options = []; 
     $(select).find('option').each(function() { 
        options.push({value: $(this).val(), text: $(this).text()}); 
     }); 
     $(select).data('options', options); 

     $(textbox).bind('change keyup', function() { 
      var options = $(select).empty().scrollTop(0).data('options'); 
      var search = $.trim($(this).val()); 
      var regex = new RegExp(search,"gi"); 

      $.each(options, function(i) { 
       var option = options[i]; 
       if(option.text.match(regex) !== null) { 
        $(select).append(
         $('<option>').text(option.text).val(option.value) 
        ); 
       } 
      }); 
     }); 
    }); 
}; 
</script> 

http://www.lessanvaezi.com/filter-select-list-options/

當我使用此過濾器的選擇框它過濾既未選中和選中。我希望它僅篩選未選中的項目,因爲如果用戶想要重新選擇篩選項並重新篩選,則先前選擇的項目將消失 - 除非它們符合篩選條件。

我並不擅長JavaScript或JQuery,也無法理解我如何告訴上面的腳本忽略「:selected」但是過濾所有其他選項的選項。

這裏有一個jfiddle如果有幫助:http://jsfiddle.net/UmKXy/我希望選項一和二保持選擇,並在用戶開始鍵入時在列表中。

感謝您的幫助!

+0

你應該提供一個jsfiddle也許 –

回答

0

到選擇的非選擇的選項,使用:

$('option:not[selected]') or $('#myselect > option:not[selected]') 

以除去它們,使用此:

$('option:not[selected]').remove(); 
在CSS

:not過濾器的什麼來在彎曲括號相反。 和[]是屬性選擇器。

所以:not[selected]表示:does not have an attribute whose key is "selected"

0

你有,因爲他創造了在啓動選項數組,然後再配對正則表達式的選項(如果沒有關於什麼是真正選擇)將無法用所選元素的工作解決方案。我使用跨度隱藏了過去的選項,併爲您創建了一個示例來了解它的工作原理。這裏是鏈接:http://jsfiddle.net/rD6wv/

這裏是代碼

$(function() { 
    $("#filterByText").bind('keyup',function(){ 
    var search = $.trim($(this).val()); 
    var regex = new RegExp(search,"gi"); 
    $("#filez").find('option').each(function(){ 
     if(!$(this).is(':selected')){ 
     if($(this).val().match(regex) === null) { 
      $(this).wrap('<span>'); 
     }else if($(this).parent().is('span')){  
      $(this).parent().replaceWith($(this)); 
     } 
     } 
    });  
    }); 
}); 

你只需要遍歷選擇的所有選項,當你在文本框中輸入。 然後你檢查它是否被選中,是否你什麼都不做,否則你檢查它是否與搜索過濾器匹配,如果它包含在一個範圍內,使它不可見,否則它意味着你需要看到它,所以你檢查它是否已經包裹在一個範圍內,在這種情況下,你用選項來替換它,這樣你就可以再次看到它。

+0

這似乎有點kludgy - 我不想包裹跨度的任何項目,使他們消失,我想列表中的未選定選項成爲「<選項...選擇「時,選擇時會顯示」「 – Geo316

+0

我不明白,您是不是想要一個可以過濾的列表,但是選定的項目不受過濾器影響嗎? t看看「kludgy」是什麼,在所有瀏覽器中的span包裝選項很簡單。 –