Не считывает клик по кнопке, которая выводится через JS
Всем привет.
Прошу помощи. Есть несколько проблем. Есть массив с названием направления и ценами по разным категориям. При этом по направлениям не всегда есть цены по всем категориям. Изначально мне нужно вывести список всех направлений по заданной категории. И это не совсем работает у меня. Если я вывожу в консоль, то там он находит все нужные элементы. А если я вывожу в html, то выдает только последний элемент... Потом в этом же списке рядом с каждым направлением есть кнопка заказа, при нажатии на кнопку появляется форма, в которой некоторые поля уже заполнены данными из этого направления. Эта кнопка заказа отказывается работать... Не запускается функция. Хотя если я эту кнопку буду выводить не через JS, а сразу задам в html - то она работает...
var arrPrice = [
['Роза хутор',300,500,800,1000],
['Красная Поляна',200,400,800,1200],
['Сочи',400,600,1000,1500],
['Абхазия',1200,0,3000,0],
['Пляжи',200,0,0,0],
['Деревня',500,0,990,0],
];
$('#komfort-show').click(function comfortCalc() {
console.log('Показать тарифы Комфорт');
$('#komfort-container').fadeIn();
for (var i = 0; i < arrPrice.length; i++) {
var a = arrPrice[i][1];
if (a > 0) {
$("#komfort-price").html('<div class="row white-bg"><div class="col-sm-5"><span class="napravlenie">' + arrPrice[i][0] + '</span></div><div class="col-sm-3 text-center"><span class="napravlenie-price">' + arrPrice[i][1] + 'руб.' + '</span></div><div class="col-sm-4"><button class="cp-btn-style1 showform" id="showtestform">Заказать</button><div class="container-fluid form-container" id="form-comfort-1"><div class="row"><div class="col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-10 col-xs-offset-1"><form class="popup-form row"><div class="form-group col-sm-12"><label for="otkuda-comfort-id-' + i + '">Откуда забрать</label><input type="text" class="form-control" name="Откуда" id="otkuda-comfort-id-' + i + '" value="Аэропорт Сочи" readonly></div><div class="form-group col-sm-12"><label for="napravlenie-comfort-id-'+ i + '">Куда отвезти</label><input type="text" class="form-control" name="Куда" id="napravlenie-comfort-id-' + i + '" value="' + arrPrice[i][0] + '" readonly></div><div class="form-group col-sm-12"><label for="class-comfort-id-' + i + '">Класс автомобиля</label><input type="text" class="form-control" name="Класс" id="class-comfort-id-' + i + '" value="Комфорт" readonly></div><div class="form-group col-sm-12"><label for="price-comfort-id-' + i + '">Стоимость поездки</label><input type="text" class="form-control" name="Стоимость" id="price-comfort-id-' + i + '" value="' + arrPrice[i][1] + '" readonly></div><div class="form-group col-sm-12"><label for="data-comfort-id-' + i + '">Дата</label><input type="text" class="form-control" name="Дата" id="data-comfort-id-' + i + '" value=""></div><div class="form-group col-sm-12"><label for="reis-comfort-id-' + i + '">Номер рейса</label><input type="text" class="form-control" name="Рейс" id="reis-comfort-id-' + i + '" value=""></div><div class="form-group col-sm-12"><label for="name-comfort-id-' + i + '">Имя*</label><input type="text" class="form-control" name="Имя" id="name-comfort-id-' + i + '" value="" required></div><div class="form-group col-sm-12"><label for="phone-comfort-id-' + i + '">Телефон*</label><input type="text" class="form-control" name="Телефон" id="phone-comfort-id-' + i + '" value="" required></div><button type="submit" class="cp-btn-style1 form-button">Отправить заявку</button><div class="close-form">❌</div></form></div></div></div></div></div>');
}
}
});
$('#showtestform').click(function showtestform() {
console.log('Открыть форму');
$('#form-comfort-1').fadeIn();
});
$('.close-form').click(function closetestform() {
console.log('Закрыть форму');
$('#form-comfort-1').fadeOut();
});
Если эту форму смотреть в html, то выглядит она примерно так
<div class="row white-bg">
<div class="col-sm-5">
<span class="napravlenie">' + arrPrice[i][0] + '</span>
</div>
<div class="col-sm-3 text-center">
<span class="napravlenie-price">' + arrPrice[i][1] + 'руб.' + '</span>
</div>
<div class="col-sm-4">
<button class="cp-btn-style1 showform" id="showtestform">Заказать</button>
<div class="container-fluid form-container" id="form-comfort-1">
<div class="row">
<div class="col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-10 col-xs-offset-1">
<form class="popup-form row">
<div class="form-group col-sm-12">
<label for="otkuda-comfort-id-1">Откуда забрать</label>
<input type="text" class="form-control" name="Откуда" id="otkuda-comfort-id-1" value="Аэропорт Сочи" readonly>
</div>
<div class="form-group col-sm-12">
<label for="napravlenie-comfort-id-1">Куда отвезти</label>
<input type="text" class="form-control" name="Куда" id="napravlenie-comfort-id-1" value="' + arrPrice[i][0] + '" readonly>
</div>
<div class="form-group col-sm-12">
<label for="class-comfort-id-1">Класс автомобиля</label>
<input type="text" class="form-control" name="Класс" id="class-comfort-id-1" value="Комфорт" readonly>
</div>
<div class="form-group col-sm-12">
<label for="price-comfort-id-1">Стоимость поездки</label>
<input type="text" class="form-control" name="Стоимость" id="price-comfort-id-1" value="' + arrPrice[i][1] + '" readonly>
</div>
<div class="form-group col-sm-12">
<label for="data-comfort-id-1">Дата</label>
<input type="text" class="form-control" name="Дата" id="data-comfort-id-1" value="">
</div>
<div class="form-group col-sm-12">
<label for="reis-comfort-id-1">Номер рейса</label>
<input type="text" class="form-control" name="Рейс" id="reis-comfort-id-1" value="">
</div>
<div class="form-group col-sm-12">
<label for="name-comfort-id-1">Имя*</label>
<input type="text" class="form-control" name="Имя" id="name-comfort-id-1" value="" required>
</div>
<div class="form-group col-sm-12">
<label for="phone-comfort-id-1">Телефон*</label>
<input type="text" class="form-control" name="Телефон" id="phone-comfort-id-1" value="" required>
</div>
<button type="submit" class="cp-btn-style1 form-button">Отправить заявку</button>
<div class="close-form">❌</div>
</form>
</div>
</div>
</div>
</div>
</div>
|
строка 15
if (a > 0) аналог if (true) |
16 строка вместо
.append вместо .html |
Цитата:
Я пробовал там делать while, но это вешало браузер напрочь))) |
Цитата:
Осталось понять почему функция не вызывается с кнопки... |
так если не нужно, уберите 15 и 17 строку из кода
|
Цитата:
|
у вас айдишкники одинаковые в каждом таком элементе, устраните проблему.
|
the_little,
в вашем массиве по индексам [i][1] все элементы больше 0 наименьший там 200 |
Цитата:
|
Цитата:
Да, это я оставил на тестовый период, пока выводилась только одна запись. Сейчас сделал там тоже через i. Но проблема сохраняется. Клик по кнопке не срабатывает. Не то что не выводится форма. Даже в консоль не выводит сообщение, что кнопка нажата. И ошибок при этом нет. |
А как же тогда эту функцию переписать, чтобы менялся id?
$('#showtestform-0').click(function showtestform() {
$('#form-comfort-0').fadeIn();
});
Там возможно через классы нужно тогда делать... Делать .showtestform вместо id, находить ближайший div с классом, например form-container. Тогда id-ники вообще там не нужны будут. |
клик соответственно тоже надо на каждую повесить ЦИКЛОМ, сделайте обновленный пример
|
можно уже в имеющейся цикл на 13 строке, только после добавления всех потрохов
|
Событие надо вешать либо, когда форма уже "нарисована" (строки 21-29 поставить перед 19-й), либо можно так написать:
$('#komfort-price').on('click', '#showtestform', function showtestform() {
console.log('Открыть форму');
$('#form-comfort-1').fadeIn();
});
$('#komfort-price').on('click', '.close-form',function closetestform() {
console.log('Закрыть форму');
$('#form-comfort-1').fadeOut();
});
про айдишки - не вникла, тут же одна форма, не вижу, где они повторяются... |
Manyasha,
не одна, вы почитайте полностью темку. |
хотя нормальной практикой будет сделать одну, а информацию добавлять по клику на кнопку.
|
the_little,
Цитата:
|
Цитата:
там 4 кнопки, думал на каждую повесить свою функцию. |
Цитата:
наверное так будет действительно правильно. Если уж на то пошло, то формировать эти списки тоже можно не по клику, а при загрузке. а по клику - просто показывать этот список. я просто не догоняю, если я сделал одну форму - круто. то как при нажатии на разные кнопки туда инфо добавлять? так, есть мысли. сейчас все попробую переписать, чтобы одна форма была, и по клику только показывался блок. |
the_little,
все просто
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<!-- какай-то информационный блок -->
<div>
<span>Тут какие-то данные 1</span>
<button>кнопка-1</button>
</div>
<!-- какай-то информационный блок -->
<div>
<span>Тут какие-то данные 2</span>
<button>кнопка-2</button>
</div>
----------------------------------
<!-- наша форма -->
<div id="form">
Это форма <br>
тут уже что-то есть
<p>сюда надо передать данные из блока</p>
</div>
<script>
$('button').click(function(){
var a = $(this).prev().text(); //берем нужные нам данные
$('#form p').text(a); // передаем в форму
});
</script>
прошу прощения за абстрактность |
Спасибо! Сейчас попробую на своем примере.
|
Всем спасибо! Сделал одну форму. Теперь в нее все подставляется. А таблицы с данными формируются не по клику а заранее. По клику просто появляются.
Получился такой вот код.
$(document).ready(function() {
var arrPrice = [
['Адлер',500,1000,800,2300],
['Олимпийский парк',500,1200,800,2300],
['Граница ПСОУ',500,1200,800,2500],
['Хоста',700,1500,1000,2800],
['Спутник',800,0,0,3500],
['Сочи Центр',900,2000,1700,4000],
['Мамайка',1000,0,1900,4300],
['Дагомыс',1300,2500,2500,5000],
['Лоо',1500,0,3000,6300],
['Вардане',1700,0,3600,7000],
['Шексна',1800,0,3600,7300],
['Головинка',2200,0,4500,9000],
['Чемитоквадзе',2400,0,4800,10000],
['Лазаревское' ,3200,6000,5600,11000],
['Аше',3600,0,6000,0],
['Магри',4000,0,7000,0],
['Шепси',4300,0,7200,0],
['Туапсе',4800,9000,7500,15000],
['Агой' ,5000,0,8200,0],
['Небуг',5300,0,8800,17000],
['Сосновый',5300,0,9000,0],
['Ольгинка',5500,0,10000,0],
['Новомихайловка',5700,0,10500,0],
['Джубга',6500,12000,11000,20000],
['Геленджик',8500,18000,12000,25000],
['Новороссийск',9000,0,13000,0],
['Анапа',10000,0,14000,0],
['Порт Кавказ',12000,20000,15000,0],
['Краснодар',8000,18000,12000,0],
['п.Красная Поляна',1200,0,2300,0],
['Эсто Садок',1300,0,2400,0],
['Роза Хутор',1300,3000,2500,6000],
['Горки Город высота 960',1500,0,2800,0],
['Горная Олимпийская деревня высота 1170',1700,0,3000,0],
['Газпром высота 1389',2000,0,3200,0],
['Республика Абхазия - Гагра',3500,0,6000,0],
['Республика Абхазия - Пицунда',4500,0,7000,0],
['Республика Абхазия - Гудаута',5000,0,8000,0],
['Республика Абхазия - Новый Афон',5500,0,9000,0],
['Республика Абхазия - Сухум',6500,0,10000,0],
['Республика Абхазия - о.Рица',5500,0,10000,0],
];
for (var i = 0; i < arrPrice.length; i++) {
var a = arrPrice[i][1];
if (a > 0) {
$("#comfort-price").append('<div class="row white-bg"><div class="col-sm-5"><span class="napravlenie">' + arrPrice[i][0] + '</span></div><div class="col-sm-3 text-center"><span class="napravlenie-price">' + arrPrice[i][1] + 'руб.' + '</span></div><div class="col-sm-4"><span class="span-class" style="display:none">Комфорт</span><button class="cp-btn-style1 showform">Заказать</button></div></div>');
}
var b = arrPrice[i][2];
if (b > 0) {
$("#business-price").append('<div class="row white-bg"><div class="col-sm-5"><span class="napravlenie">' + arrPrice[i][0] + '</span></div><div class="col-sm-3 text-center"><span class="napravlenie-price">' + arrPrice[i][2] + 'руб.' + '</span></div><div class="col-sm-4"><span class="span-class" style="display:none">Бизнес</span><button class="cp-btn-style1 showform">Заказать</button></div></div>');
}
var c = arrPrice[i][3];
if (c > 0) {
$("#miniven-price").append('<div class="row white-bg"><div class="col-sm-5"><span class="napravlenie">' + arrPrice[i][0] + '</span></div><div class="col-sm-3 text-center"><span class="napravlenie-price">' + arrPrice[i][3] + 'руб.' + '</span></div><div class="col-sm-4"><span class="span-class" style="display:none">Минивен</span><button class="cp-btn-style1 showform">Заказать</button></div></div>');
}
var d = arrPrice[i][4];
if (d > 0) {
$("#bus-price").append('<div class="row white-bg"><div class="col-sm-5"><span class="napravlenie">' + arrPrice[i][0] + '</span></div><div class="col-sm-3 text-center"><span class="napravlenie-price">' + arrPrice[i][4] + 'руб.' + '</span></div><div class="col-sm-4"><span class="span-class" style="display:none">Автобус</span><button class="cp-btn-style1 showform">Заказать</button></div></div>');
}
}
$('#comfort-show').click(function() {
$('#comfort-container').show();
$('#business-container').hide();
$('#miniven-container').hide();
$('#bus-container').hide();
});
$('#business-show').click(function() {
$('#comfort-container').hide();
$('#business-container').show();
$('#miniven-container').hide();
$('#bus-container').hide();
});
$('#miniven-show').click(function() {
$('#comfort-container').hide();
$('#business-container').hide();
$('#miniven-container').show();
$('#bus-container').hide();
});
$('#bus-show').click(function() {
$('#comfort-container').hide();
$('#business-container').hide();
$('#miniven-container').hide();
$('#bus-container').show();
});
$('.showform').click(function(){
$('.form-container').fadeIn();
var d = $(this).closest(".white-bg").find(".napravlenie").text();
$('#napravlenie-id').val(d);
var e = $(this).closest(".white-bg").find(".napravlenie-price").text();
$('#price-id').val(e);
var f = $(this).closest(".white-bg").find(".span-class").text();
$('#class-id').val(f);
});
$('.close-form').click(function closetestform() {
$('.form-container').fadeOut();
});
});
|
$('#comfort-show, #bus-show, #miniven-show, #business-show ').click(function() {
$('#comfort-container').show();
$('#bus-container, #business-container, #miniven-container').hide();
});
есть над чем работать |
47-64 строки
var arrClass = ['#comfort-price','#business-price', '#miniven-price', '#bus-price'];
for (var i = 0; i < arrPrice.length; i++) {
for (var j = 1; j < arrPrice[i].length; j++) {
var a = arrPrice[i][j];
if (a) $(arrClass[j-1]).append('<div class="row white-bg"><div class="col-sm-5"><span class="napravlenie">' + arrPrice[i][0] + '</span></div><div class="col-sm-3 text-center"><span class="napravlenie-price">' + a + 'руб.' + '</span></div><div class="col-sm-4"><span class="span-class" style="display:none">Комфорт</span><button class="cp-btn-style1 showform">Заказать</button></div></div>');
}
}
|
Цитата:
А у меня при нажатии на разные кнопки скрываются и показываются разные блоки. Но вот про такую запись всегда забываю. $('#bus-container, #business-container, #miniven-container').hide(); |
А как в массиве найти строку, в которой например первый элемент = 'Адлер'. Ну т.е. индекс нужен строки...
Все что нахожу касается поиска по одномерному массиву. |
Цитата:
|
Цитата:
arr.findIndex(el => el == 'Адлер');если не найдет вернет -1 |
Цитата:
var index = arrPrice.findIndex(el => el == 'Адлер'); выдает -1 |
var index = arrPrice.findIndex(el => el[0] == 'Адлер'); в вашем случае |
Цитата:
|
var arr = ['comfort','business','miniven','bus'];
arr.forEach(function(el){
$('#'+el+'show').click(function(){
$('#'+el+'container').show();
arr.forEach(function(elt){
if(elt!=el)$('#'+elt+'container').hide();
});
});
});
протестируйте |
| Часовой пояс GMT +3, время: 17:49. |