Javascript 使用jQuery Redux隐藏选择列表中的选项

Javascript 使用jQuery Redux隐藏选择列表中的选项,javascript,jquery,dom,select,option,Javascript,Jquery,Dom,Select,Option,看 公认的答案是完全错误的;它不兼容跨浏览器 投票最多的解决方案(删除选项,但保留完整列表的克隆)是我一直在做的,但它不再适用于我。我必须在各种场景下添加和删除选项,因此如果我用完整列表(通过ajax获得)替换列表,我必须再次对其进行过滤,以获得我真正想要的选项。。。所有这些选择都是基于其他选择,所以它变得非常糟糕 我的问题是,是否有一个插件可以从DOM中删除这些选项,但记住它们的位置,以便以后可以轻松地重新添加到同一位置?从而使选项的跨浏览器隐藏/显示 (function($) { $

公认的答案是完全错误的;它不兼容跨浏览器

投票最多的解决方案(删除选项,但保留完整列表的克隆)是我一直在做的,但它不再适用于我。我必须在各种场景下添加和删除选项,因此如果我用完整列表(通过ajax获得)替换列表,我必须再次对其进行过滤,以获得我真正想要的选项。。。所有这些选择都是基于其他选择,所以它变得非常糟糕

我的问题是,是否有一个插件可以从DOM中删除这些选项,但记住它们的位置,以便以后可以轻松地重新添加到同一位置?从而使选项的跨浏览器隐藏/显示

(function($) {
    $.fn.hideOption = function(val) {
        var lastPos = 0;
        $(this).children('option').each(function() {
            var pos = $(this).data('prevPos');
            if(!pos) $(this).data('prevPos', lastPos++);
            else lastPos = pos+1;
        });
        var options = $(this).children('option[value="'+val+'"]');
        var hiddenOptions = $(this).data('hiddenOptions');
        if(!hiddenOptions) hiddenOptions = options;
        else hiddenOptions = hiddenOptions.add(options);
        $(this).data('hiddenOptions', hiddenOptions);
        options.detach();
    };

    $.fn.showOption = function(val) {
        var hiddenOptions = $(this).data('hiddenOptions');
        if(!hiddenOptions) return;
        var toAdd = null;
        if(typeof(val) !== 'undefined') {
            toAdd = hiddenOptions.filter(function() {
                return $(this).val() == val;
            });
        } else {
            toAdd = hiddenOptions;
        }
        hiddenOptions = hiddenOptions.not(toAdd);
        $(this).data('hiddenOptions', hiddenOptions);
        var visibleOptions = $(this).children();
        var select = this;
        var value = $(this).val();
        toAdd.each(function(i,hidOpt) {
            var optAdded = false;
            visibleOptions.each(function(j,visOpt) {
                if($(hidOpt).data('prevPos') >= $(visOpt).data('prevPos')) {
                    $(hidOpt).insertAfter(visOpt);
                    optAdded = true;
                    return;
                }
            });
            if(!optAdded) $(hidOpt).prependTo(select);
        }); 
        $(this).val(value);
    };
})(jQuery);

请尝试打破它或建议改进它的方法

请尝试打破它或建议改进它的方法