Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   списки в динамических таблицах (https://javascript.ru/forum/dom-window/71684-spiski-v-dinamicheskikh-tablicakh.html)

maksqwerty 05.12.2017 13:22

списки в динамических таблицах
 
Ранее у меня были вопросы по ajax https://javascript.ru/forum/ajax/715...taet-post.html
Так как этот вопрос решился, возникли новые.
У меня в динамической таблице есть 2 списка.
При клике в таблицу добавляются новые поля , как и эти два списка.
Если в первом поле таблицы у элементов
id = "test1"

То в следующем поле
id = "test2"

Далее
id = "test3"
, и так далее.
Изменяется только ИД, класс тот же.
Когда добавил ajax запрос, всё работает нормально,
но вот когда добавляю новые поля в таблицу, то у списков там "стандартное значение"
И когда я выбираю нужное значение в новосозданном списке, то значения меняются и в других, связанных с этим списками.
Что нужно?
Что бы у новосозданных списках значение было такое же, как у предыдущего списка (если у списка с
id = "spisok1"
, то у списка с
id = "spisok2"
было такое же значение)
Это я попытался сделать так (через общий класс)
$(function () {
    var select = $('select.fertig');
    select.on('change', function () {
        select.not(this).val(this.value);
    });
})

Но оно, почему то, не работает.
И было бы хорошо, если б у этих списков был б только этот выбранный вариант, а других бы не было видно, но я не знаю, как это реализовать:-?
Всё, что нужно, что бы у всех списков определенного класса значение было такое же, как у первого списка этого же класса

рони 05.12.2017 14:00

maksqwerty,
$(function () {
    var table = $('table');
    table.on('change', 'select.fertig', function () {
        $('select.fertig').not(this).val(this.value);
    });
})

maksqwerty 05.12.2017 14:37

Работает, и это уже хорошо, но работает не совсем так, как нужно
оно меняет значение, только когда я уже добавил новые поля,
а нужно, что бы как только я добавил поле, а значение списка уже было изменено на нужное
(тут наверное нужно присвоить event пока не существующим элементам, но как это сделать, я не знаю)
А ещё, вопрос: почему нужно прописывать table, разве без этого скрипт не видит нужных элементов?

рони 05.12.2017 15:03

maksqwerty,
скрипты не телепаты, они не знают что вы захотите добавить, но есть делегирование
родитель следит за изменениями внутри себя.
строка 3 это "делегирование" в jquery.
Цитата:

Сообщение от maksqwerty
что бы как только я добавил поле, а значение списка уже было изменено на нужное

- это не понимаю, при создании селекта установите нужное вам значение, или после создания возможно так
$('select.fertig:first').trigger('change')

maksqwerty 05.12.2017 15:19

у меня значения селекта приходят с бд
как бы это сказать, мне нужно, что бы скрипт смотрел, какое значение у первого элемента, и менял значение списков, которые будут создаваться, на нужное, и при этом удалял другие варианты.
Спасибо за делегирование, буду вкуривать.
Эта строка, что вы написали, это пример делегации?

рони 05.12.2017 15:24

maksqwerty,
ответ написан ранее :)

maksqwerty 05.12.2017 15:27

Окей, куда тогда мне втыкнуть строчку с делегацией в выше написаный вами скрипт, шобыработало?:)

рони 05.12.2017 15:31

Цитата:

Сообщение от maksqwerty
Окей, куда тогда мне втыкнуть строчку с делегацией в выше написаный вами скрипт, шобыработало?

не понимаю, о чём вы

maksqwerty 05.12.2017 15:41

Ну как сделать этот скрипт с делегированием,
Цитата:

что бы как только я добавил поле, а значение списка уже было изменено на нужное
Цитата:

- это не понимаю, при создании селекта установите нужное вам значение, или после создания возможно так
$('select.fertig:first').trigger('change')
Цитата:

$(function () {
var table = $('table');
table.on('change', 'select.fertig', function () {
$('select.fertig').not(this).val(this.value);
});
})

рони 05.12.2017 15:43

maksqwerty,
где код создания нового селекта?

maksqwerty 05.12.2017 15:55

function deleteRow(el)
{
    var del = el.parentNode.parentNode.rowIndex;
    table.deleteRow(del);
    while (table.rows[0]){
        updateRow(table.rows[del], del, false);
        del++;
    }

}

function insRow()
{
    var new_row = updateRow(clone.cloneNode(true), ++tbody.rows.length, true);
    tbody.appendChild(new_row);
}

 function updateRow(row, del)
 {
    row.cells[0].innerHTML = del;


    var inp1 = row.cells[1].getElementsByTagName('input')[0];
    inp1.id = 'inp1ut'+ del;
 

    var inp2 = row.cells[2].getElementsByTagName('input')[0];
    inp2.id = 'inp2ut'+ del;
  

   var sel1 = row.cells[3].getElementsByTagName('select')[0];
    sel1.id ='fertig'+ del;
 
    var sel2 =row.cells[4].getElementsByTagName('select')[0];
    sel2.id ='kost'+ del;

    var but1 = row.cells[5].getElementsByTagName('button')[0];
    but1.id = 'deletebutton'+del;

    return row;
}

Вот

рони 05.12.2017 15:59

maksqwerty,
в конец строки 15

$('select.fertig:first').trigger('change')

maksqwerty 05.12.2017 16:06

А это разве ничего, что у меня таблица на обычном js написана, а тут jquery
inb4: всё-равно не работает:(

рони 05.12.2017 16:10

maksqwerty,
может нет класса fertig?

рони 05.12.2017 16:13

maksqwerty,
может ошибки в консоли есть ?

maksqwerty 05.12.2017 16:21

Есть такой класс
в консоли ошибок нет.
через дебаггер смотрю, тоже нормально всё
скрипт будто игнорирует эту строку

Nexus 05.12.2017 16:34

Может так?
$('select[id*="fertig"]:first').trigger('change');

Или так:
$('select.fertig:first').change(function(){
    alert('asd');
}).trigger('change');

maksqwerty 05.12.2017 16:39

ну оно же id перебирает.
а класс у меня таким и остался, каким я написал в html.
этот список сейчас выглядит вот так:
<select id="fertig1" name="fertig[]" class="fertig" onchange="моя функция ajax()" >
               <?php
	include('position/fertig.php');	
		?>
</select>

рони 05.12.2017 17:03

maksqwerty,
строка 33
sel1.value = document.getElementById('fertig1').value;

maksqwerty 05.12.2017 17:22

Цитата:

Может так?
$('select[id*="fertig"]:first').trigger('change');
не работает. Ошибки unexpected token

Цитата:

строка 33
sel1.value = document.getElementById('fertig1').value;
а вот это работает, спасибо :dance:
Но только вот есть ещё другая проблема.
Элементы этих списков зависят от другого списка.
Если я в том другом списку выберу, к примеру, tetst1,
то в этом списке будут видны, к примеру 5 элементов,
а если выберу, test2, то будут видны другие элементы.
Я это делал через display:none -> display:block
$(document).ready(function(){
	$("#eart").change(function(){
		var val = $("#eart").val();
		 if (val == "1"){
			
			$(".000").css("display", "block");
			$(".310").css("display", "none");
			$(".311").css("display", "block");
			$(".312").css("display", "block");
			$(".313").css("display", "none");
			$(".314").css("display", "block");
			$(".318").css("display", "none");
			$(".319").css("display", "block");
				}else if (val == "2"){
		
			$(".000").css("display", "none");
			$(".310").css("display", "block");
			$(".311").css("display", "block");
			$(".312").css("display", "none");
			$(".313").css("display", "block");
			$(".314").css("display", "none");
			$(".318").css("display", "block");
			$(".319").css("display", "none");
		}
	
	});
});

Эти классы, которые я скрываю/показываю - классы вариантов списка fertig
<option id="" class="000">test</option>

К примеру.

С первым элементом всё нормально показывает.
А у других, динамически созданных, элементов есть все варианты (т.е везде стоит блок)
Что с этим можно сделать?

laimas 05.12.2017 18:50

maksqwerty,
не проще ли связать классами группы и опции? Тогда вместо .000 ... будет типа $('.a').css(...), где, а это группа. Ну или класс один с добавлением значения 1 и 2.

maksqwerty 05.12.2017 18:59

Цитата:

не проще ли связать классами группы и опции?
я не задумывался о этом пока.
Мне бы сперва решение задания найти, а потом ою оптимизации кода думать :(

laimas 05.12.2017 19:02

Цитата:

Сообщение от maksqwerty
Мне бы сперва решение задания найти

Так и решение задачи упрощается - отпадает необходимость в if и прочих else.

maksqwerty 05.12.2017 19:16

Но разве поможет это решению
Цитата:

С первым элементом всё нормально показывает.
А у других, динамически созданных, элементов есть все варианты (т.е везде стоит блок)
Что с этим можно сделать?
?

laimas 05.12.2017 19:47

Цитата:

Сообщение от maksqwerty
Но разве поможет это решению

Это смотрите выше, вам уже было сказано - либо делегирование, либо обработчик элементам устанавливается после их добавления в документ.


Часовой пояс GMT +3, время: 03:17.