1

ここの別の投稿からこの jfiddle を見つけました。

オリジナル: http://jsfiddle.net/ZTF5J/2/

1.9 と私の変更: http://jsfiddle.net/4423c/

.live()Jquery 1.9 ではサポートされなくなったようです。コードの一部を変更してドロップダウン メニューを削除することはできましたが、新しいフィルターを追加しても正しく機能しません。

次のコードを使用すると、フィルターを一度に削除できます。ただし、新しいフィルターを追加する場合、値が現在存在するかどうかは確認されません。

$('body').on('click', '.closeselect', function(){    
    if($('.closeselect').length > 1) {
        $(this).parent().remove();
        disableSelectedOption();
        $('#addmore').show();
    }
});

選択値をチェックする他の部分を変更してみました。明らかに正常に動作しません。

$('body').on('change', '.mySelect', function(){    
    disableSelectedOption();
});
4

2 に答える 2

3

$(this).attr('disabled', 'disabled');

する必要があります

$(this).prop('disabled', 'disabled');

jQuery .attr マニュアル エントリから:

jQuery 1.6 以降、.attr() メソッドは、設定されていない属性に対して undefined を返します。、、またはフォーム要素の状態 などの DOM プロパティを取得および変更するには、 .prop()メソッドを使用します。checkedselecteddisabled

于 2013-05-17T02:46:27.687 に答える
0

コードにいくつか問題があるため、ここに書き直しました。

$(function() {
    var $container = $('.js-selectblock'),
    nrOfOptions = $container.find('select').prop('options').length,
    $getBlocks = function() {
        return $container.children('.js-select');
    },
    $getParent = function(element) {
        return $(element).closest('.js-select');
    };

    $('#addmore').click(function() {
        var $blocks = $getBlocks();

        if ($blocks.length < nrOfOptions) {
            // restrict values on new dropdown
            var $new = $blocks.eq(0).clone();
            restrictValues($new.find('select'), getSelectedValues(), true);
            $new.appendTo($container);

            updateButtons();
        }
    }); 

    $container.on('click', '.closeselect', function() {
        if ($getBlocks().length > 1) {
            $getParent(this).remove();
            updateButtons();
        }
    });

    $container.on('change', '.mySelect', function() {
        $getBlocks().not($getParent(this)).each(function() {
            restrictValues($('select', this), getSelectedValues());
        });
    });

    function restrictValues($element, values, isnew)
    {
        var options = $element.prop('options'),
        selected = $element.prop('selectedIndex');

        for (var i = 0; i < options.length; ++i) {
            if (values.indexOf(options[i].value) !== -1) {
                options[i].disabled = isnew || selected != i;

                if (isnew && selected == i) {
                    ++selected;
                }
            } else {
                options[i].disabled = false;
            }
        }
        $element.prop('selectedIndex', selected);
    }

    function getSelectedValues()
    {
        var values = [];

        $getBlocks().find('select').each(function() {
            values.push($(this).val());
        });

        return values;
    }

    function updateButtons()
    {
        $('#addmore')[$getBlocks().length < nrOfOptions ? 'show' : 'hide']();
    }
});
于 2013-05-17T04:11:09.170 に答える