JavaScript jquery-chosen 选择框插件

lshgood · 2013年01月12日 · 最后由 svafly 回复于 2019年07月08日 · 70723 次阅读

Chosen 是一个 JavaScript 插件,它能让丑陋的、很长的 select 选择框变的更好看、更方便,不仅如此,它更扩大了,增长了主动筛选的功能。它可对列表进行分组,同时也可禁用某些选择项。目前,它支持 jQuery 和 Prototype 两种 JavaScript 引擎。

http://harvesthq.github.com/chosen/

<select class="chzn-select" data-placeholder="Choose a Country" style="width:350px;" tabindex="1"> 
               <option value=""></option>  
               <option value="United States">United States</option>  
               <option value="United Kingdom">United Kingdom</option>  
               <option value="Afghanistan">Afghanistan</option>  
               <option value="Albania">Albania</option>  
</select>


初始化:

$(".chzn-select").chosen();




js 参数设置



  在调用 chosen()办法时,我们可以设置一些参数:

选项 描述 no_results_text 无搜刮成果显示的文本 allow_single_de 是否容许作废选择 max_ed_options 当为多选时,最多选择个数

  搜不到时,提示:

 $(".chzn-select").chosen({ 
                                      no_results_text: "没有找到",
                                      allow_single_de: true
});

  事务

a)change 事务:

$(".chzn-select").chosen().change(function(){
   ......
});



b)当我们须要动态更新下的选择项时,只要在更新选择项后触发 Chosen 中的 liszt:d 事务就可以了:

$(".chzn-select").html(""...<%option%>china<%/option%>..."");
$(".chzn-select").trigger("liszt:d");



若是不想要搜刮框的话,用 css 把它隐蔽掉:

.chzn-container-single .chzn-search {
    display: none;
}



  提示下:

ie6 和 ie7 直接返回对象本身,看 chosen.jquery.js:

if ($.browser.msie && ($.browser.version === "6.0" || ($.browser.version === "7.0" && document.documentMode === 7))) {
        return this;
}

如何给选项分组?

在 html 中增加 optgroup 标签。

<select data-placeholder="Your Favorite Football Teams" style="width:350px;" class="chzn-select" multiple tabindex="6">
                <option value=""></option>
                <optgroup label="NFC EAST">

                  <option>Dallas Cowboys</option>
                  <option>New York Giants</option>
                  <option>Philadelphia Eagles</option>
                  <option>Washington Redskins</option>
                <optgroup>
                <optgroup label="NFC NORTH">
                  <option>Chicago Bears</option>

                  <option>Detroit Lions</option>
                  <option>Green Bay Packers</option>
                  <option>Minnesota Vikings</option>
                </optgroup>
</select>

如何开启多选支持? 增加个多选属性 multiple

<select data-placeholder="Choose a Country" class="chzn-select" multiple style="width:350px;"tabindex="4">
                <option value=""></option> 
                <option value="United States">United States</option> 
                <option value="United Kingdom">United Kingdom</option> 
                <option value="Afghanistan">Afghanistan</option> 
                <option value="Albania">Albania</option> 
                <option value="Algeria">Algeria</option> 
</select>

var selectObj = $(".select");
    $("#"+selectObj.attr("id")+"_chzn").remove();
    selectObj.removeClass();
    selectObj.addClass("chzn-select select");
    $(".select").html("<option value='United States'>United States</option>
                       <option value='Afghanistan'>Afghanistan</option> ") 
    selectObj.chosen({no_results_text: "没有匹配结果"});

很弱的一个替换内容。

现在整个输入动态去服务端获取数据。看到的朋友,有高见,指点指点

这类插件要注意 z-index, overflow hidden 等,会造成遮挡或者显示不全

#5 楼 @doitian 多谢,提醒。欢迎吐槽。

simple_form 里面关联方法   association
<%= simple_form_for @user do |f| %>
  <%= f.input :name %> 
  <%= f.input :pwd %>  
  <%= f.association :detall, :collection => {"--请选择--" => "--请选择"}, :input_html => { :class => 'chzn-select wocaonema',:style => "width:350px;", :url => "/detalls/search"} %>
  <%= f.button :submit %>
<% end %>

增加了一个 url 属性,动态去服务端获取数据。还修改了它的原文件。

老刘在线直播啊...

#8 楼 @kaka 没,从来没发帖,试试感觉。

用 js 动态增加 optgroup 标签,结果 optgroup 的标签全部不显示,默认的 display:none,只显示 option 的东西,求解答

#10 楼 @lily3 不清楚你那边情况。你先用纯 html 是否能显示?

纯 html 可以实现,只是 js 动态添加的时候不能显示

#12 楼 @lily3

你肯定没执行 trigger("liszt:updated")

$(".select").append("HTML")

你在增加完后,执行下面方法

$(".select").trigger("liszt:updated")

这个问题我把 chosen.jquery.js 里面的源码改了一下解决了,还有一个问题,我在同一个页面使用超过一个这样的 select 样式时,好像会把这个页面上 select 附近的某一 div 隐藏显示不出来,我在想这是不是这个插件的 bug?有没有解决方法呢

#14 楼 @lily3 这个就不清楚了。你调试一下,看那影响 div 了。要不你先不要改别人原文件,使用我上面那方法试试。

恩恩,多谢你的耐心解答

这个插件在 ie6、ie7 或者 ie 兼容模式不能使用怎么解决啊?

我想了解 chosen 提交到后台,获取到的是 value,那从后台返回的 value,如何显示该 value 的 name 呢?

#5 楼 @doitian 在 IE 下出现显示不全怎么处理

在 IE 下出现显示不全怎么处理

ie6 7 不支持的。我有一年没做 ruby 了现在转 ios。懂的人。帮忙回复一下。3q。。

在 popup dialog 里面,超出的部分会被遮挡,有没有办法解决?

我按照图片的那种调用方式,搜索的时候只匹配到了首字母,怎么回事呢? 比如输入 e,却没有把 Germany 等显示出来呢?

24 楼 已删除

#23 楼 @meylove 已经解决了,把 js 文件里的函数 get_search_regex 的参数改了下,原本是匹配已输入字符开始的单词,我把‘^’这个符号删掉了,就是包含输入字符的选项了。

感谢,使用到了,很有帮助!

多选无法传值到后台,请问是怎么回事啊!

这个插件下拉框能根据控件位置向上向下展开吗?

这个好像不能像 php 的 %$search% 这样的模糊查询,只能从开始到结束的查询

meylove 回复

我这里是这样的,怎么修改呀

如果没有数据,可以输入后,自动填入吗

qinjiehua 回复

在使用的时候开启 search_contains 为 true 就好了

$(".select-chosen").chosen({
        no_results_text: "没有找到搜索的结果!",//没有搜到结果时显示的值
        width: "250px",//下拉选框的宽度
        allow_single_deselect: true, //选择后允许编辑
        search_contains:true
    });
需要 登录 后方可回复, 如果你还没有账号请 注册新账号