コードにいくつか問題があるため、ここに書き直しました。
$(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']();
}
});