【问题标题】:Hide option in jQuery-UI selectmenu隐藏 jQuery-UI 选择菜单中的选项
【发布时间】:2019-05-20 18:01:30
【问题描述】:

隐藏选择中的选项是一项简单的任务。

jQuery("#bbb").hide();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<select id="mySelect">
    <option id="aaa">A</option>
    <option id="bbb">B</option>
    <option id="ccc">C</option>
</select>

但它在 Selectmenu UI 中是如何工作的?我只能删除选项,但隐藏它们似乎是不可能的。

例如,我尝试在选择 Farbe 上隐藏选项“RAL Sonderfarbe”:

尝试(在开发控制台中):

var $el = jQuery('option:contains("RAL Sonderfarbe")');
$el.hide();
$hausfux_laenge_dropdown.find('select').selectmenu('refresh');

但它不起作用。

我找到了解决方法,但是如果调用了selectmenu('refresh');,则该选项再次出现...

$('#mySelect').selectmenu();
var mySelectOpened = false;

$('#mySelect').selectmenu({
    open: function(event, ui) {
        if (mySelectOpened == false) {
            mySelectOpened = true;
            var $el1 = $('#mySelect option:contains("B")');
            var $el2 = $('li:contains("B")');
            
            $el1.hide();
            $el2.hide();
        } 
    }
});

$("#refresh").click(function() {
    $('#mySelect').selectmenu('refresh');
});
<link href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>

<select id="mySelect">
    <option id="aaa">A</option>
    <option id="bbb">B</option>
    <option id="ccc">C</option>
</select>

<button id="refresh">Refresh Selectmenu UI</button>

【问题讨论】:

  • 为什么投反对票?

标签: jquery jquery-ui jquery-ui-selectmenu


【解决方案1】:

在选项上将disabled 属性设置为true,这将为该选项生成liui-state-disabled,然后您可以使用CSS 将其隐藏:

$(function() {
  var $el = jQuery('option:contains("B")');
  $el.attr('disabled',true);
  $('#mySelect').selectmenu();
});
li.ui-state-disabled {
  display:none;
}
<link href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>

<select id="mySelect">
    <option id="aaa">A</option>
    <option id="bbb">B</option>
    <option id="ccc">C</option>
</select>

但是所有禁用的选项都是不可见的。

【讨论】:

  • 谢谢,但是我不能不隐藏选项就禁用它们。
  • 唯一的其他选项是从源选择语句中删除选项,然后刷新您的选择菜单小部件。这就是我最终所做的。
【解决方案2】:

我通过扩展核心 jQuery UI javascript 和 css 解决了这个问题。

示例:

var $el = jQuery('option:contains("B")');
$('#mySelect').selectmenu();

jQuery('#hide_option_b').click(function() {
  $el.attr('hidden',true);
  $('#mySelect').selectmenu('refresh');
});
jQuery('#show_option_b').click(function() {
  $el.attr('hidden',false);
  $('#mySelect').selectmenu('refresh');
});
<link href="https://cdn.jsdelivr.net/gh/Eddcapone/custom_jquery-ui-1.12.1@master/jquery-ui.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/gh/Eddcapone/custom_jquery-ui-1.12.1@master/jquery-ui.js"></script>

<select id="mySelect">
    <option id="aaa">A</option>
    <option id="bbb">B</option>
    <option id="ccc">C</option>
</select>

<button id="hide_option_b">Hide option B</button>
<button id="show_option_b">Show option B</button>

我将此添加到jquery-ui.css (https://raw.githubusercontent.com/Eddcapone/custom_jquery-ui-1.12.1/master/jquery-ui.css)

/* Hidden */
.ui-state-hidden { display: none; }

我在jquery-ui.min.js (https://raw.githubusercontent.com/Eddcapone/custom_jquery-ui-1.12.1/master/jquery-ui.js) 中更改/添加了一些行:

_renderItem 更改为:

_renderItem: function( ul, item ) {
    var li = $( "<li>" ),
        wrapper = $( "<div>", {
            title: item.element.attr( "title" )
        } );

    if ( item.disabled ) {
        this._addClass( li, null, "ui-state-disabled" );
    }

    this._setText( wrapper, item.label );

    return li.append( wrapper ).appendTo( ul );
},

_renderItem: function( ul, item ) {
    var li = $( "<li>" ),
        wrapper = $( "<div>", {
            title: item.element.attr( "title" )
        } );

    if ( item.disabled ) {
        this._addClass( li, null, "ui-state-disabled" );
    }
    if ( item.hidden ) {
        this._addClass( li, null, "ui-state-hidden" );
    }

    this._setText( wrapper, item.label );

    return li.append( wrapper ).appendTo( ul );
},

还有_parseOption来自:

_parseOption: function( option, index ) {
    var optgroup = option.parent( "optgroup" );

    return {
        element: option,
        index: index,
        value: option.val(),
        label: option.text(),
        optgroup: optgroup.attr( "label" ) || "",
        disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" ),
    };
},

_parseOption: function( option, index ) {
    var optgroup = option.parent( "optgroup" );

    return {
        element: option,
        index: index,
        value: option.val(),
        label: option.text(),
        optgroup: optgroup.attr( "label" ) || "",
        disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" ),
        hidden: optgroup.prop( "hidden" ) || optgroup.css( "display" ) == "none" || optgroup.css( "visibility" ) == "hidden"
                || option.prop( "hidden" ) || option.css( "display" ) == "none" || option.css( "visibility" ) == "hidden"
    };
},

现在隐藏选项会自动检测并隐藏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2011-03-15
    • 1970-01-01
    • 2021-10-27
    • 2014-03-02
    相关资源
    最近更新 更多