#jquery #forms #select #append #option
#jquery #формы #выберите #добавить
Вопрос:
У меня есть форма с большим количеством опций.
В форме я могу сделать данные частными или общедоступными, чтобы;
- Сделайте данные конфиденциальными: да, нет (переключатели)
- Если нажать «Да», отобразится скрытый div с еще 2 параметрами формы; a. поиск по имени участника (ввод текста) b. выбранные участники (поле множественного выбора).
Если я нажму сделать данные приватными «да» и выполню поиск по имени пользователя, найденные результаты будут отображаться в виде окна с предложениями. Когда я нажимаю на имя пользователя (в одном из найденных результатов, отображаемых в окне предложения), я могу успешно добавить его в свой список избранных участников
Если я решу сделать это общедоступным и нажму сделать данные приватными «нет» после добавления некоторых участников в мое поле множественного выбора (выбранные участники), я удалю все параметры и добавлю туда 1 вариант обратно (Общедоступный просмотр).
Проблема начинается после этого. Перед отправкой формы, если я снова нажму сделать данные приватными «да» (1; нажал «Да», выбрал некоторых участников, 2; нажал «Нет» и удалил все параметры из selectbox, 3; снова нажал «Да»), выполняю поиск некоторых участников и нажимаю на них, в моем окне множественного выбора (выбранные участники) добавляется 2 раза.
Интересно, что если я сделаю это 2 раза (добавлю некоторых участников, нажму «Нет» для конфиденциальности и удалю параметры), в следующий раз, когда я захочу добавить некоторых участников, это будет добавлено 2 раза. Если я делаю это 5 раз, это добавляет 5 раз.
Вот мой Jquery;
// Private Options
$('input[name=make_private]').bind('click', function() {
// Make It Private
if ($(this).val() == 1) {
$('.frm_make_private_1').fadeIn(1000);
// Get clicked member
$('a.member').live('click', function() {
var username = $(this).text();
var id = $(this).attr("id");
// Add it to the Allowed Members Multi Selectbox
$('#allowedMembers').append($("<option></option>").attr("value", id).text(username).attr("selected", "selected"));
// Don't load the page
return false;
});
}
// Make It Public
else {
// Hide everything about Product Privacy
$('.frm_make_private_1').fadeOut(1000);
// Remove All Options
$("#allowedMembers option").each(function() {
$(this).remove();
});
// Add Public Option
$('#allowedMembers').append($("<option></option>").attr("value", 0).text("Public View"));
}
});
Ответ №1:
При многократной привязке событий вам следует .unbind()
сначала. В противном случае у вас будет несколько (и, возможно, одинаковых) событий, привязанных к одному и тому же действию
Попробуйте
('input[name=make_private]').unbind().bind('click', function () {
// Make It Private
if ($(this).val() == 1) {
$('.frm_make_private_1').fadeIn(1000);
// Get clicked member
$('a.member').unbind().live('click', function () {
var username = $(this).text();
var id = $(this).attr("id");
// Add it to the Allowed Members Multi Selectbox
$('#allowedMembers').append($("<option></option>").attr("value", id).text(username).attr("selected","selected"));
// Don't load the page
return false;
});
}
// Make It Public
else {
// Hide everything about Product Privacy
$('.frm_make_private_1').fadeOut(1000);
// Remove All Options
$("#allowedMembers option").each(function() {
$(this).remove();
});
// Add Public Option
$('#allowedMembers').append($("<option></option>").attr("value", 0).text("Public View"));
}
});
Комментарии:
1. Привет, Рон, во-первых, спасибо за твой ответ. Где именно я должен это использовать и как я должен это использовать? Я не эксперт, я был бы рад, если бы вы могли помочь.
2. Привет, Рон, спасибо за твой ответ. К сожалению, добавление .unbind() перед bind (‘click’) и live (‘click’) не помогло 🙁
3. Нашел способ, переместив $ (‘a.member’).live (‘click’) за пределы $ (‘input [name=make_private]’).bind(‘click’) сделал свое дело. Спасибо за помощь. Я хотел бы принять ваш ответ в качестве решения (по крайней мере, вспомогательного), но я не знаю, хороший ли это путь. Я здесь новичок, у вас есть какие-либо предложения?
4. Не беспокойтесь. Принимайте только те решения, которые решают проблему. Чтобы люди, которые столкнутся с этим вопросом в будущем, не запутались. Голосуйте за все, что полезно.
5. Большое спасибо, у меня слишком низкая репутация, чтобы сейчас иметь возможность голосовать. Сделаю это, как только смогу. Еще раз, спасибо.
Ответ №2:
Нашел способ, переместив $ (‘a.member’).live (‘click’) за пределы $ (‘input [name=make_private]’).bind(‘click’) сделал свое дело. Спасибо, Рон, за руководство мной.
// Private Options
$('input[name=make_private]').bind('click', function () {
// Make It Private
if ($(this).val() == 1) {
$('.frm_make_private_1').fadeIn(1000);
}
// Make It Public
else {
// Hide everything about Product Privacy
$('.frm_make_private_1').fadeOut(1000);
// Remove All Options
$("#allowedMembers option").each(function() {
$(this).remove();
});
// Add Public Option
$('#allowedMembers').append($("<option></option>").attr("value", 0).text("Public View"));
}
});
// Get clicked member
$('a.member').live('click', function () {
var username = $(this).text();
var id = $(this).attr("id");
// Add it to the Allowed Members Multi Selectbox
$('#allowedMembers').append($("<option></option>").attr("value", id).text(username).attr("selected","selected"));
// Don't load the page
return false;
});