#javascript #html #jquery #forms #function
#javascript #HTML #jquery #формы #функция
Вопрос:
Я создал форму для выбора навыков. После того, как сделан 1-й выбор, отображается 2-й список с параметрами, зависящими от 1-го выбора. Затем кнопка » » позволяет дублировать поля и добавлять другой навык.
Моя проблема :
Начальная форма в порядке, но когда я нажимаю » «, вторая созданная форма не работает (второе «поле выбора» не фильтруется в соответствии с первым выбором.
Пожалуйста, вы можете помочь?
Большое спасибо.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Skill form</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js" /></script>
</head>
<body>
<h1>Insert your skills</h1>
<div class="copycat">
<div id="form">
<form action="" method="post" name="addbloc">
<p>
<label for="tpl">Family :</label>
<select name="tpl" id="tpl">
<option value="">-- Select your family --</option>
<option value="Language" data-id='#champ1'>Language</option>
<option value="Cooking" data-id='#champ2'>Cooking</option>
</select><br />
<div class="champ" id="champ1">
<label for="Language">Skill :</label>
<select name="Language" id="Language">
<br/>
<option value="">-- Select your skill --</option>
<option value="Spanish" data-id='#champ1'>Spanish</option>
<option value="Chineese" data-id='#champ1'>Chineese</option>
<option value="French" data-id='#champ1'>French</option>
</select><br />
<input onclick="copycat();" id="button" value=" " type="button">
</div>
<div class="champ" id="champ2">
<label for="Cooking">Skill :</label>
<select name="Cooking" id="Cooking">
<br/>
<option value="">-- Select your skill --</option>
<option value="Italian" data-id='#champ2'>Italian</option>
<option value="Mexican" data-id='#champ2'>Mexican</option>
<option value="Japanese" data-id='#champ2'>Japanese</option>
<option value="Greek" data-id='#champ2'>Greek</option>
</select><br />
<input onclick="copycat();" id="button" value=" " type="button">
</div>
</p>
</form>
</div>
</div>
<!-- WIP ----- Submit button to store in database -->
<div style="z-index:99;"><input type="submit" name="Submit" value="Submit" class="bouton"></div>
<script type="text/javascript">
// Show 2nd field according to first field selection
$(document).ready(function() {
$('.champ').hide(); // on cache les champ par défaut
$('select[name="tpl"]').change(function() { // lorsqu'on change de valeur dans la liste
$('.champ').hide();
var selectedDataID = $(this).find('option:selected').attr('data-id');
$(selectedDataID).show();
});
});
// Duplicate field when button is pressed
function copycat(){
$('.copycat:first').clone().appendTo($('#form'));
}
</script>
</body>
</html>
Комментарии:
1. Что означает «не фильтруется»?
2. Если я выберу «Приготовление» в 1-м поле (семейство), я должен увидеть «Итальянский, мексиканский, японский и греческий» во втором поле.
3. Ах, хорошо. Понял.
4. Если я выберу «Язык» в 1-м поле (семейство), я должен увидеть «Испанский, китайский и французский» во втором поле. Но это не работает после дублирования.
5. Понятно. Спасибо за разъяснения.
Ответ №1:
Вы не можете использовать одно и то же ids
для разных элементов, поэтому вместо id
этого я изменил это на атрибуты html, то есть : . data-id
Затем, когда вы выбираете любую опцию в поле выбора, должны изменяться только те разделы, которые находятся внутри form
, а не другие, которые добавляются динамически, поэтому используйте $(this).closest("form")..
для внесения изменений внутри формы htmls . Наконец, эти элементы создаются динамически, поэтому используйте $(document).on('change', 'select[name="tpl"]',..
.
Кроме того, ваша copycat
функция копирует весь div, поэтому в следующий раз, если вы нажмете
, она покажет 2
копию select и так далее.Чтобы исправить это, используйте $('.copycat form:first')...
.
Демонстрационный код :
$(document).ready(function() {
$('.champ').hide();
$(document).on('change', 'select[name="tpl"]', function() {
$(this).closest("form").find('.champ').hide(); //hide the champ div inside form which is there
var selectedDataID = $(this).find('option:selected').attr('data-id');
//get the div with dta-id of slected option
$(this).closest("form").find("div[data-id=" selectedDataID "]").show();
});
});
// Duplicate field when button is pressed
function copycat() {
//copy first form
$('.copycat form:first').clone().appendTo($('#form'));
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1>Insert your skills</h1>
<div class="copycat">
<div id="form">
<form action="" method="post" name="addbloc">
<p>
<label for="tpl">Family :</label>
<!--instead of id added data-id -->
<select name="tpl" id="tpl">
<option value="">-- Select your family --</option>
<option value="Language" data-id='champ1'>Language</option>
<option value="Cooking" data-id='champ2'>Cooking</option>
</select><br />
<!--added data-id-->
<div class="champ" data-id="champ1">
<label for="Language">Skill :</label>
<select name="Language" id="Language">
<br/>
<option value="">-- Select your skill --</option>
<option value="Spanish" data-id='#champ1'>Spanish</option>
<option value="Chineese" data-id='#champ1'>Chineese</option>
<option value="French" data-id='#champ1'>French</option>
</select><br />
<input onclick="copycat();" id="button" value=" " type="button">
</div>
<!--added data-id-->
<div class="champ" data-id="champ2">
<label for="Cooking">Skill :</label>
<select name="Cooking" id="Cooking">
<br/>
<option value="">-- Select your skill --</option>
<option value="Italian" data-id='#champ2'>Italian</option>
<option value="Mexican" data-id='#champ2'>Mexican</option>
<option value="Japanese" data-id='#champ2'>Japanese</option>
<option value="Greek" data-id='#champ2'>Greek</option>
</select><br />
<input onclick="copycat();" id="button" value=" " type="button">
</div>
</p>
</form>
</div>
</div>
<!-- WIP ----- Submit button to store in database -->
<div style="z-index:99;"><input type="submit" name="Submit" value="Submit" class="bouton"></div>
Комментарии:
1. Спасибо @Swati. Вы делаете мой день, и я многому научился с вашим ответом! Хотел бы я когда-нибудь помочь вам в ответ! 🙂
2. рад помочь 🙂