Как я могу индивидуально обращаться к строкам в HTML-таблице? - PullRequest
0 голосов
/ 17 сентября 2018

Здесь у меня есть небольшой столик, где я могу сначала выбрать пол из выпадающего списка.Этот выбор затем ограничивает выбор второго раскрывающегося списка.

Теперь проблема в том, что если я выберу, например, «Männlich» в первой записи и добавлю вторую строку поверх кнопки, во втором раскрывающемся списке появится ограничение в соответствии с первой строкой, в которой я выбрал"Männlich".

Как сделать выбор для каждой строки отдельно?Кто-нибудь может мне помочь?

$('#selectOption1').on('change', setAnrede);

function setAnrede() {
  if ($(this).val() === 'Männlich') {
    $('.input-field option[value="Sehr geehrte"]').hide();
    $('.input-field option[value="Liebe"]').hide();
    $('.input-field option[value="Werte"]').hide();

    $('.input-field option[value="Sehr geehrter"]').show();
    $('.input-field option[value="Lieber"]').show();
    $('.input-field option[value="Werter"]').show();

  }

  if ($(this).val() === 'Weiblich') {
    $('.input-field option[value="Sehr geehrter"]').hide();
    $('.input-field option[value="Lieber"]').hide();
    $('.input-field option[value="Werter"]').hide();

    $('.input-field option[value="Sehr geehrte"]').show();
    $('.input-field option[value="Liebe"]').show();
    $('.input-field option[value="Werte"]').show();

  }
}


function addRow(tableID) {

  var table = document.getElementById(tableID);

  var rowCount = table.rows.length;
  var row = table.insertRow(rowCount);

  var colCount = table.rows[1].cells.length;

  for (var i = 0; i < colCount; i++) {

    var newcell = row.insertCell(i);

    newcell.innerHTML = table.rows[1].cells[i].innerHTML;
    //alert(newcell.childNodes);
    switch (newcell.childNodes[1].type) {
      case "checkbox":
        newcell.childNodes[1].checked = false;
        break;
    }
  }
}

function deleteRow(tableID) {
  try {
    var table = document.getElementById(tableID);
    var rowCount = table.rows.length;

    for (var i = 0; i < rowCount; i++) {
      var row = table.rows[i];
      var chkbox = row.cells[0].querySelector('input[name=chk]');
      if (chkbox && true == chkbox.checked) {
        if (rowCount <= 2) {
          alert("Cannot delete all the rows.");
          break;
        }
        table.deleteRow(i);
        rowCount--;
        i--;
      }


    }
  } catch (e) {
    alert(e);
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="#">
  <input type="button" value="Empfänger hinzufügen" onclick="addRow('myTable')" />
  <input type="button" value="Empfänger löschen" onclick="deleteRow('myTable')" />
  <div class="table-wrapper">
    <div class="table-scroll">
      <table id="myTable" border=1>
        <tr>
          <th></th>
          <th>Geschlecht</th>
          <th>Anrede</th>
          <th>Vorname</th>
          <th>Nachname</th>
          <th>Titel</th>
          <th>E-Mail</th>
          <!--                                    <th>Sendedatum</th>-->
          <!--                                    <th>Edit</th>-->
        </tr>
        <tr>
          <td>
            <p>
              <label>
                            <input type="checkbox" name="chk"/>
                            <span></span>
                        </label>
            </p>
          </td>
          <td>
            <div class="input-field">
              <div>
                <label for="selectOption1">Geschlecht angeben:</label>
                <select class="browser-default" id="selectOption1" required>
                  <option value="Bitte auswählen" selected>Bitte auswählen</option>
                  <option value="Männlich">Männlich</option>
                  <option value="Weiblich">Weiblich</option>
                </select>
              </div>
            </div>
          </td>
          <td>
            <div class="input-field">
              <div>
                <label for="selectOption2">Anrede angeben:</label>
                <select class="browser-default" id="selectOption2" required>
                  <option value="Bitte auswählen" selected>Bitte auswählen</option>
                  <option value="Sehr geehrter">Sehr geehrter</option>
                  <option value="Sehr geehrte">Sehr geehrte</option>
                  <option value="Lieber">Lieber</option>
                  <option value="Liebe">Liebe</option>
                  <option value="Werter">Werter</option>
                  <option value="Werte">Werte</option>
                  <option value="Hallo">Hallo</option>
                </select>
              </div>
            </div>
          </td>
          <td>
            <div>
              <input id="vorname" type="text" class="validate">
            </div>
          </td>
          <td>
            <div>
              <input id="nachname" type="text" class="validate">
            </div>
          </td>
          <td>
            <div>
              <input id="titel" type="text">
            </div>
          </td>
          <td>
            <div>
              <input id="vorname" type="text" class="validate">
            </div>
          </td>
          <!--                                    <td>-->
          <!--                                        <input type="text" class="datepicker validate">-->
          <!--                                    </td>-->
          <!--                                    <td>-->
          <!--                                        <input type='button' class='AddNew' value='+'>-->
          <!--                                    </td>-->
        </tr>
      </table>
    </div>
  </div>
</form>

1 Ответ

0 голосов
/ 17 сентября 2018

Как я уже сказал в своем комментарии, ваши динамически генерируемые строки не будут реагировать на изменение вашего пола, так как событие click не связано.этого можно избежать, изменив $('#selectOption1').on('change', setAnrede); на

$('table').on('change', '.genderSelect', setAnrede); 

, это привязывает событие к таблице, но срабатывает только тогда, когда событие изменения соответствует элементу-потомку с классом .genderSelect (который вы теперьсначала добавьте в поле выбора;))

, вместо того, чтобы показывать / скрывать ненужные значения, я предпочитаю устанавливать параметры только тогда, когда выбран пол.Кроме того, я хотел бы, чтобы в моем коде было только место, где я определяю параметры своих полей выбора.главным образом, чтобы избежать if заявлений или ошибок из-за неправильного написания.поэтому в начале сценария я создаю объект, который я использую для заполнения параметров обоих полей выбора!

 var gsAddress = {
   "neutral": ["Guden", "Hallo", "Moin"],
   "male": ["Sehr geehrter", "Werter", "Lieber"],
   "female": ["Sehr geehrte", "Werte", "Liebe"]
 };

, как я уже сказал, я хочу заполнить оба поля выбора параметрами, используянад объектом.

первое поле выбора (sexSelect) нуждается в новой функции, которая вызывается внутри функции готовности документа:

$(".genderSelect").each(prefillGenderSelect); //don't forget to add the class to the select element

function prefillGenderSelect() {
   var curSelBox = this; //assign the current context to a variable
   $.each(gsAddress, function(key, value) { // loop through the object, created above
     var newOption = $('<option/>', {
       'value': key, // the current gender where you're cycling through
       'class': 'anyClass', // add any needed classes for <option>
       'text': key // same again as value (but can be different)
     }).appendTo(curSelBox);
   })
 }

, как только вы измените полSelect, setAnrede срабатывает и заполняетсяПоле выбора gsAddress с его параметрами.Моя функция setAnrede выглядит следующим образом:

function setAnrede() {
   var myRow = $(this).closest("tr"); // travel up your DOM
   var curSelectBox = myRow.find(".gsAddress"); //travel down your DOM and find your select Box
   $(curSelectBox).find("option").remove(); //wipe out all existing options

   $.each(gsAddress[$(this).val()], function(index, value) { //gs for gender specific

     var newOption = $('<option/>', {
       'value': value, // the current gsAdress where you're cycling through
       'class': 'anyClass', // add any needed classes for <option>
       'text': value // same again as value(but can be different)
     }).appendTo(curSelectBox);
   });
 }

для вашей кнопки «добавить строку».вместо того, чтобы копировать первую строку, вы должны определить строку по умолчанию как объект и просто добавить ее в свою таблицу.это будет похоже на объект 'option', созданный ранее

var defaultRow = $("<tr/>"); //if there are attributes like class and id needed, add them like in the option declaration.

var exampleCell = $("<td/>", {    //every cell needs to be defined, ofc
  'class' : 'aTableCell'         //if you need to add class information to the td
  }
$(defaultRow).append(exampleCell); //and if it is created, append it into your row
$("#myTable").append(defaultRow); // in the end, just append the complete row to your table

Я создал рабочую скрипку.но я сократил HTML до необходимого минимума, а также реализовал простую кнопку addRow, используя функцию .clone () jquery.это было только там, чтобы видеть, работает ли это все еще на новых строках..clone () также копирует идентификаторы элементов, когда они существуют.поэтому клонирование не должно выполняться, если нужны идентификаторы ... вот ссылка: http://jsfiddle.net/sbtywfjL/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...