有几个问题我很难弄清楚。我有一个下拉菜单和一个按钮,可将所选选项添加到multiple select
控件中。我遇到的第一个问题是当multiple select
有多个选项并且您尝试添加的内容已经存在时,无论存在多少选项,都会调用选项已经存在的警报。要重现我试图解释的内容,请按照以下步骤操作:
这是一个显示问题的jsFiddle。
- 从下拉列表中选择一个选项
- 点击添加
- 从下拉列表中选择其他选项
- 单击添加(多选控件中现在应该有两个选项)
- 再次单击添加(尝试添加您在步骤 4 中添加的相同选项)
问题 1:应该发生在第 5 步,其中两次触发警报。
我假设发生这种情况是因为警报在.each()
方法内,因此会为每个现有选项触发它。
您可以通过从下拉列表中添加第三个选项来更进一步,这会导致第二个问题。添加第三个选项后,即使此时它在multiple select
控件中不存在,也会触发选项已存在的警报。然后,您可以尝试添加三个选项中的任何一个,并且由于所有三个选项都将存在,警报将被触发三次。以下是重现此问题的步骤:
- 执行上面列出的步骤 1-4
- 从下拉列表中选择第三个选项(尚未添加的那个)
- 点击添加(问题应该在这里发生)
问题 2:当您单击添加时,即使该选项当时不存在,也会触发警报。
问题:我需要更改什么以便(问题 1)无论控件中存在多少选项,您都只会收到一次警报,multiple select
并且(问题 2)在添加第三个选项时不会收到警报,因为它在添加时间?
这是添加选项的代码:
if ($('#lbl1').html() != "") {
if ($('#select2 > option').length == 0) {
$('<option>').text(txt).prependTo('#select2')
.val(txt).prependTo('#select2');
$('#select2').trigger('change')
.find('option').prop('selected', true);
} else if ($('#select2 > option').length >= 1) {
$('#select2 > option').each(function() {
if ($('#select2 > option').val() != $('#lbl1').html()) {
$('<option>').text(txt).prependTo('#select2')
.val(txt).prependTo('#select2');
$('#select2').trigger('change')
.find('option').prop('selected', true);
} else {
alert('Option already exists.');
return;
}
});
}
}
我还应该注意我尝试的另一个角度是.each()
在语句中移动方法,if
但也遇到了问题。当我尝试这种方式时,第一个问题不会发生,但是当您添加第三个选项时,它会被添加两次。
这是一个显示此尝试的jsFiddle 。要重现,请添加所有三个选项。添加第三个选项后,您应该会看到它被添加了两次。
这是该代码:
if ($('#lbl1').html() != "") {
if ($('#select2 > option').length == 0) {
$('<option>').text(txt).prependTo('#select2')
.val(txt).prependTo('#select2');
$('#select2').trigger('change')
.find('option').prop('selected', true);
} else if ($('#select2 > option').length >= 1) {
if ($('#select2 > option').val() != $('#lbl1').html()) {
// Difference is here: moved method inside 'if' statement
$('#select2 > option').each(function() {
$('<option>').text(txt).prependTo('#select2')
.val(txt).prependTo('#select2');
$('#select2').trigger('change')
.find('option').prop('selected', true);
});
} else {
alert('Option already exists.');
return;
}
}
}