Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   disabled на динамически созданые элементы (https://javascript.ru/forum/dom-window/72110-disabled-na-dinamicheski-sozdanye-ehlementy.html)

maksqwerty 09.01.2018 16:45

disabled на динамически созданые элементы
 
Есть таблица с динамическими полями.
При выборе в одном селекте (вне этой таблицы) двух вариантов - инпуты должны быть без атрибута disabled, при остальных - с ним.
Эти инпуты - динамически созданные элементы таблицы при клике на кнопку.
Я читал о делегации событий, но код все-равно не работает.
Вот сам код:
$(document).ready(function(){
var $state = $('#eart'),
    $province = $('.ind');
$state.on("change",function() {
    if ($state.val() == 'EZ') {
        $province.removeAttr('disabled');
    }else if($state.val() == 'MUB2') {
        $province.removeAttr('disabled');
    } else {
        $province.attr('disabled', 'disabled').val('');
    }
}).trigger('change');
});

$province = $('.ind'); - решил брать класс, так как он у них общий.
Скрипт работает только для первого элемента, а для других, которые создаются при клике на кнопку - нет.
Что я делаю не так?

laimas 09.01.2018 16:51

Цитата:

Сообщение от maksqwerty
$state.on("change",function()

Это не делегирование, делегирование, это

$(кому делегируют).on("change", "кто делегирует", function()

рони 09.01.2018 16:54

Цитата:

Сообщение от maksqwerty
Я читал о делегации событий,

почему не использовали делегирование, если читали? форум полон примеров, можно и документацию прочесть

рони 09.01.2018 17:31

:write: похоже не нужно тут делегирования
$(document).ready(function(){
var $state = $('#eart');
    $state.on("change",function() { 
var $province = $('.ind');

    if ($state.val() == 'EZ') {
        $province.removeAttr('disabled');
    }else if($state.val() == 'MUB2') {
        $province.removeAttr('disabled');
    } else {
        $province.attr('disabled', 'disabled').val('');
    }
}).trigger('change');
});

maksqwerty 16.01.2018 13:15

Спасибо, всё работает, но не так как нужно :(
Скрипт работает корректно с элементами, которые есть уже.
Но если, например, сначала выбрать в селлекте любое значение кроме "EZ" или "MUB2", то у полей ввода с классом "ind" будет аттрибут "disabled", а у динамически созданных элементов нет.
Как сделать так, что бы сперва можно было выбрать корректное значение в списке, и сразу после этого ставился аттрибут disabled на всех динамически созданных полях ввода с классом "ind"?:help:

рони 16.01.2018 13:39

maksqwerty,
добавьте строку, там где создаёте элементы в конец
$('#eart').trigger('change');

maksqwerty 16.01.2018 15:27

Сама динамическая таблица выглядит таким образом:
var table = document.getElementById('dynamictable'),
tbody = table.getElementsByTagName('tbody')[0],
clone = tbody.rows[0].cloneNode(true); 




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 = 'mat'+ del;
 

    var inp2 = row.cells[2].getElementsByTagName('input')[0];
    inp2.id = 'ind'+ del;
 
    var inp3 = row.cells[3].getElementsByTagName('input')[0];
    inp3.id = 'ben'+ del;

    var inp4 = row.cells[4].getElementsByTagName('input')[0];
    inp4.id = 'men'+ del;

    var inp5 = row.cells[5].getElementsByTagName('input')[0];
    inp5.id = 'preis'+ del;
  

    var inp6 = row.cells[6].getElementsByTagName('input')[0];
    inp6.id = 'wert'+ del;
   

    var sel1 = row.cells[7].getElementsByTagName('select')[0];
    sel1.id ='ferti'+ del;
    sel1.value = document.getElementById('ferti1').value;

    var inp7 = row.cells[8].getElementsByTagName('input')[0];
    inp7.id = 'sap'+ del;
 

    var sel2 =row.cells[9].getElementsByTagName('select')[0];
    sel2.id ='kost'+ del;
    sel2.value = document.getElementById('kost1').value;

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

    return row;
}

И куда бы я не добавил эту строку, которую вы написали, она не работает :(

рони 16.01.2018 15:33

maksqwerty,
в 23 строку

maksqwerty 01.02.2018 18:06

В связи с некоторыми обстоятельствами вынужден снова поднять эту тему.
А можно делать "выборку" не по значению, а по классу?
Т.е. вместо
if ($state.val() == 'EZ') {

Написать, к примеру
if ($state.attr('class') == 'EZ') {

Так как в value я вынужден использовать совершенно другие значения.

j0hnik 01.02.2018 18:32

maksqwerty,
Можно! а можно создать data-val атрибут, как вам удобнее

maksqwerty 02.02.2018 10:46

Цитата:

Сообщение от j0hnik (Сообщение 476823)
maksqwerty,
Можно! а можно создать data-val атрибут, как вам удобнее

Окей, но как именно?
Я никогда так раньше не делал, поэтому не знаю :agree:
А что за data-val? Как с ним работать?

Nexus 02.02.2018 11:11

$('.some_class').css('color','red');//Выборка по классу
$('[data-value="some-value"]').css('color','red');//Выборка по data-атрибуту

maksqwerty 02.02.2018 11:28

Цитата:

Сообщение от Nexus (Сообщение 476851)
$('.some_class').css('color','red');//Выборка по классу
$('[data-value="some-value"]').css('color','red');//Выборка по data-атрибуту

а можно ли записать таким образом?
$state.('[data-value="EZ"]')

Nexus 02.02.2018 11:30

maksqwerty, нет, нельзя.
Что вы пытаетесь сделать - загадка.

Если нужно найти дочерние элементы у $state, удовлетворяющие селектору, то:
$state.find('[data-value="EZ"]');

maksqwerty 02.02.2018 11:55

Цитата:

Сообщение от Nexus (Сообщение 476853)
maksqwerty, нет, нельзя.
Что вы пытаетесь сделать - загадка.

у меня есть список и поле ввода. При выборе некоторых значений из списка (EZ и MUB2), у поле ввода можно писать, при всех других значениях списка у поля ввода стоит disabled.
Данные в этот список берутся с бд, т.е. у меня изначально так:
echo "<option class=".$row["matype"]." value= ".$row["matype"].">".$row["matype"]." - ".$row["group"]."</option>

Но потом я понял, что в бд обратно мне не нужно передавать ".$row["matype"].", а нужно передать ".$row["example"]."
В конечном результате это выглядит так:
echo "<option class=".$row["matype"]." value= ".$row["example"].">".$row["matype"]." - ".$row["group"]."</option>

$state.val я уже не могу использовать, так как value = не нужные значение для этого скрипта, и придётся использовать class вместо value.

Nexus 02.02.2018 12:11

"<option value= ".$row["example"]." data-val=".$row["matype"].">".$row["matype"]." - ".$row["group"]."</option>";

if($state.data('val')=='EZ')
    //do something

maksqwerty 02.02.2018 12:17

не работает
$province.attr('disabled', 'disabled').val('');

а тут как быть?

рони 02.02.2018 12:41

maksqwerty,
Цитата:

Сообщение от maksqwerty
attr

prop

maksqwerty 02.02.2018 14:45

всё-ровно не роботает :(

Nexus 02.02.2018 14:49

maksqwerty, приведите пример HTML-кода имеющего отношение к проблеме и js, который вы пытаетесь использовать.

Гадать отчего и почему у вас ничего не получается можно долго.

laimas 02.02.2018 15:05

Цитата:

Сообщение от maksqwerty
всё-ровно не роботает

А что тут решается? Если речь о списке, а значит по изменению списка, то либо сначала получить выбранный опшен, и разбираться в нем, либо относительно выбранного опшена.

maksqwerty 02.02.2018 15:43

Цитата:

Сообщение от Nexus (Сообщение 476884)
maksqwerty, приведите пример HTML-кода имеющего отношение к проблеме и js, который вы пытаетесь использовать.

<select name="eart"  id="eart"  >
	<option value="" selected="">test</option>
<?php
	$sql = "SELECT * FROM type";
	$result = $conn->query($sql);
	if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
													
echo "<option class=".$row["matype"]." data-val = ".$row["matype"]." value= ".$row["example"].">".$row["matype"]." - ".$row["group"]."</option>";											
} }		
	?>
</select>
<!--тут пойдёт динамическая таблица, код которой я выкладывал на первой странице этого треда-->
<table>
<th></th>
<th></th>
<th>Ind</th>
<td></td>
<td></td>
<td style="width: 3%"><label>
<input id="ind" type="text"  name="ind[]"  class="ind" maxlength="3"></label></td>
</table>

$(document).ready(function(){
var $state = $('#eart');
	$state.on("change", function(){
var $province = $('.ind');

    if ($state.data('val') == 'EZ') {
        $province.removeAttr('disabled');
    }else if ($state.data('val') == 'MUB2') {
        $province.removeAttr('disabled');
  
    } else {

	        $province.prop('disabled', 'disabled').val('');

	    }
}).trigger('change');
});

Nexus 02.02.2018 16:00

Вроде по-русски написал HTML-код, "html" даже выделил...
$(document).ready(function() {
    $('#eart').on("change", function() {
        var value = $(this).find('option:selected').data('val'),
            condition = (['EZ', 'MUB2'].indexOf(value) > -1);

        $('.ind').prop('disabled', !condition).val(function() {
            return condition ? this.value : '';
        });
    }).trigger('change');
});

maksqwerty 02.02.2018 17:05

Спасибо большое, заработало!


Цитата:

Сообщение от Nexus (Сообщение 476892)
Вроде по-русски написал HTML-код, "html" даже выделил...

ну вы же сами написали раньше:
Цитата:

Сообщение от Nexus (Сообщение 476892)
приведите пример HTML-кода имеющего отношение к проблеме и js, который вы пытаетесь использовать.

и js, который вы пытаетесь использовать

Nexus 02.02.2018 17:14

maksqwerty, смысла публиковать php не было никакого, я об этом писал.

maksqwerty 02.02.2018 17:17

Понял, почему-то подумал, что для полноты картины скрипт вставить нужно (что бы в случае чего, не возникало вопросов "а зачем" "а почему")


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