#javascript #jquery
#javascript #jquery
Вопрос:
Я хочу сделать возможным добавление и / или удаление входных полей и флажка (для страницы соревнований)
Несмотря на то, что, когда я нажимаю на кнопку добавления, добавляются 2 поля ввода, а когда я нажимаю кнопку удаления, исчезает только одно из них. В чем проблема?
var InputsWrapper = $("#answerDiv");
var AddButton = $(".adaddnext");
var x = InputsWrapper.length;
var FieldCount=1;
$(AddButton).click(function (e) {
FieldCount ;
$(InputsWrapper).append('<div class="adinputfield83"><div class="checkaccept cacc1"><label class="option"><input type="radio" id="contestAnswersChk_' FieldCount '" name="correct" class="validate[required]"><span class="checkbox"></span></label> </div><input type="text" id="contestAnswer_' FieldCount '" placeholder="Write possible answer" class="validate[required]"/><span class="font-entypo icon-circled-cross adaddnextremove" aria-hidden="true"></span></div></div>');
x ;
return false;
});
$("body").on("click",".adaddnextremove", function(e){
if( x > 1 ) {
$(this).parent('div').remove();
x--;
}
return false;
})
И HTML:
<div id="answerDiv">
<div class="adinputfield83">
<div class="checkaccept cacc1">
<label class="option">
<input type="radio" id="contestAnswerChk_1" name="correct" class="validate[required]">
<span class="checkbox"></span>
</label>
</div>
<input type="text" id="contestAnswer_1" placeholder="Write possible answer" class="validate[required]">
<span class="font-entypo icon-plus adaddnext" aria-hidden="true"></span>
</input>
</div>
</div>
Может кто-нибудь мне помочь? Спасибо…
Комментарии:
1. $(addButton).click(функция (e) { заменить как addButton.click(функция (e) . То же самое для всего
2. @balachandran ах да, нашел ошибку 🙂
3. Кажется, работает нормально… Чего мне не хватает?: jsfiddle.net/TrueBlueAussie/R3TLB
4. @TrueBlueAussie Да, в моем случае я добавил
add
-button с каждой строкой! Как я могу добавить кнопку после каждого поля ввода, которая добавляет только 1 дополнительное поле ввода?5. Ответ ниже… Вам нужно было другое делегированное событие для добавления. Я также преобразовал ваш string-HTML в простой шаблон, чтобы упростить его обслуживание (я думаю, вы согласитесь). 🙂
Ответ №1:
JSFiddle: http://jsfiddle.net/TrueBlueAussie/R3TLB/2 /
Вам нужно было делегированное событие для ваших add
кнопок, а также для кнопок удаления.
var InputsWrapper = $("#answerDiv");
var x = InputsWrapper.length;
var FieldCount = 1;
$(document).on('click', '.adaddnext', function (e) {
FieldCount ;
var template = $('#template').html();
template = template.replace(/{FieldCount}/g, FieldCount);
$(InputsWrapper).append(template);
x ;
return false;
});
$(document).on("click", ".adaddnextremove", function (e) {
if (x > 1) {
$(this).parent('div').remove();
x--;
}
return false;
})
HTML (с использованием шаблона HTML в фиктивном блоке скрипта):
<script id="template" type="text/template">
<div class="adinputfield83">
<div class="checkaccept cacc1">
<label class="option">
<input type="radio" id="contestAnswersChk_{FieldCount}" name="correct" class="validate[required]" /><span class="checkbox"></span>
</label>
</div>
<input type="text" id="contestAnswer_{FieldCount}" placeholder="Write possible answer" class="validate[required]" /><span class="font-entypo icon-circled-cross adaddnextremove" aria-hidden="true">Del</span>
<input type="button" class="adaddnext" value="Add" />
</div>
</script>
<div id="answerDiv">
<div class="adinputfield83">
<div class="checkaccept cacc1">
<label class="option">
<input type="radio" id="contestAnswerChk_1" name="correct" class="validate[required]" /> <span class="checkbox"></span>
</label>
</div>
<input type="text" id="contestAnswer_1" placeholder="Write possible answer" class="validate[required]"> <span class="font-entypo icon-plus adaddnext" aria-hidden="true"></span>
</input>
</div>
<input type="button" class="adaddnext" value="Add" />
</div>
Примечания:
Не используйте $('body')
для прослушивания делегированных событий. Это может иметь странные побочные эффекты при определенных событиях (в том числе click
). $(document)
Вместо этого используйте запасной вариант, если у вас нет более близкого неизменяемого предка для ваших динамических элементов. На самом деле вы должны использовать $('#answerDiv').on('click'...
, поскольку это ближайший статический предок (более эффективный и более конкретный).
Ответ №2:
Вы уже определили свои переменные в качестве селектора $(...)
, поэтому вам следует использовать только имена переменных: AddButton.click()
Затем код выглядит:
var InputsWrapper = $("#answerDiv");
var AddButton = $(".adaddnext");
var x = InputsWrapper.length;
var FieldCount=1;
AddButton.click(function (e) {
FieldCount ;
InputsWrapper.append('<div class="adinputfield83"><div class="checkaccept cacc1"><label class="option"><input type="radio" id="contestAnswersChk_' FieldCount '" name="correct" class="validate[required]"><span class="checkbox"></span></label> </div><input type="text" id="contestAnswer_' FieldCount '" placeholder="Write possible answer" class="validate[required]"/><span class="font-entypo icon-circled-cross adaddnextremove" aria-hidden="true"></span></div></div>');
x ;
return false;
});
$("body").on("click",".adaddnextremove", function(e){
if( x > 1 ) {
$(this).parent('div').remove();
x--;
}
return false;
})
или вы также можете определить свои переменные как string, например:
var AddButton = ".adaddnext"
затем вы можете использовать его, как вы делали в своем коде:
$(AddButton).click(...)
Тогда это должно выглядеть так:
var InputsWrapper = "#answerDiv";
var AddButton = ".adaddnext";
var x = InputsWrapper.length;
var FieldCount=1;
AddButton.click(function (e) {
FieldCount ;
InputsWrapper.append('<div class="adinputfield83"><div class="checkaccept cacc1"><label class="option"><input type="radio" id="contestAnswersChk_' FieldCount '" name="correct" class="validate[required]"><span class="checkbox"></span></label> </div><input type="text" id="contestAnswer_' FieldCount '" placeholder="Write possible answer" class="validate[required]"/><span class="font-entypo icon-circled-cross adaddnextremove" aria-hidden="true"></span></div></div>');
x ;
return false;
});
$("body").on("click",".adaddnextremove", function(e){
if( x > 1 ) {
$(this).parent('div').remove();
x--;
}
return false;
})
Комментарии:
1. Если вы поместите все это в скрипку, вы поймете, что это не работает, потому что HTML-код вопроса был неполным (нет кнопок добавления для каждого элемента). Эти отсутствующие кнопки добавления также нуждаются в делегировании
on
. Прочитайте все комментарии тоже.