Заполнение полей ввода с помощью сгенерированной таблицы jQuery

Я пытаюсь заполнить поля в поле ввода моего модального окна. Мое модальное окно появляется после того, как я нажимаю кнопку Edit в таблице, и оно должно заполнять поля в соответствии со строкой таблицы, в которой нажата кнопка. Я создал таблицу исключительно с помощью jQuery и извлек данные с помощью JSON. Это код, генерирующий мою таблицу:

$.getJSON("${pageContext.request.contextPath}/hostJSON", function (data) {
                var $table = $("#hostTable");
                $.each(data, function (i, h) {
                    if (h.status === "true") {
                        h.status = "<label class=\"label\" style=\"background-color: #b2c4aa;color:white\">Waiting</label>";
                    } else {
                        h.status = "<label class=\"label\" style=\"background-color: #FF8668;color:white\">Done</label>";
                    }
                    var $tr = $("<tr/>").attr('style', 'font-size:90%');
                    $("<td/>").html(h.id).appendTo($tr);
                    $("<td/>").html(h.name).appendTo($tr);
                    $("<td/>").html(h.contact).attr('style', 'text-align:center').appendTo($tr);
                    $("<td/>").html(h.email).attr('style', 'text-align:center').appendTo($tr);
                    $("<td/>").html(h.address).appendTo($tr);
                    $("<td/>").html(h.status).attr('style', 'text-align:center').appendTo($tr);
//BELOW IS THE REQUIRED LINE, WHICH IS A BUTTON:
                    $("<td/>").html("<span class=\"hostEditBtn\" data-host-name=\""+h.name+"\" data-toggle=\"modal\" data-target=\"#editEventHostModal\"><button class=\"btn btn-xs\" style=\"background-color:#b2c4aa;color:white\" data-toggle=\"tooltip\" title=\"Edit\"><span class=\"glyphicon glyphicon-pencil\"></span> Edit</button></span>").attr('style', 'text-align:center').appendTo($tr);
                    $tr.appendTo($table);
                });
            });

Когда нажимается вышеупомянутая кнопка, она успешно открывает мое модальное окно, но поле не заполняется.

$(".hostEditBtn").on('click', function () {
    var $this=$(this);
    $("#hostName").val($this.attr('data-host-name'));
});

Я включаю только часть Name, чтобы не загромождать свой пост.

Я чувствую, что должен также упомянуть, что у меня есть в общей сложности 3 файла .jsp в этом проекте, а именно index.jsp, modals.jsp и jquery.jsp, которые я включаю в свой файл index.jsp следующим образом:

<%@include file="[name of file].jsp"%>

Почему это не работает? Это потому, что пользовательский атрибут (data-host-name) создается с помощью jQuery? Как я могу заставить это работать?


person turing042    schedule 27.03.2018    source источник
comment
@VishalTajPM Модальное окно открывается этой полосой кода data-toggle=\"modal\" data-target=\"#editEventHostModal\", которая находится внутри того же тега <span>.   -  person turing042    schedule 27.03.2018
comment
Первое, что вам нужно обновить, это изменить #hostEditBtn ID на класс .hostEditBtn, поскольку вы выполняете итерацию, поэтому есть вероятность существования более одного диапазона с одним и тем же идентификатором. так как вы внутри id должны быть уникальными для всего DOM   -  person Vishal Taj PM    schedule 27.03.2018
comment
@VishalTajPM Большое спасибо за указание на это, я совершенно забыл об этом, обновлю это и в этом посте. Я внес соответствующие изменения, но поле ввода все равно не заполнилось.   -  person turing042    schedule 27.03.2018


Ответы (2)


Вы можете попробовать этот фрагмент кода. поэтому для достижения этого я не изменился, как я упоминал в комментарии, просто обновил #hostEditBtn ID до класса .hostEditBtn, а внутри .hostEditBtn просто провел рефакторинг кода. пожалуйста, попробуйте эти фрагменты:

внутри фрагментов вместо вашего ответа ajax я определил объект данных, из которого эти данные заполняются, выполните действие, основанное на вашей логике.

var $table = $("#hostTable");
var data = [{
 "status": true,
 "name": "test1",
 "contact": "12321312312",
 "email": '[email protected]',
 "address": 'test address 2'
},{
 "status": false,
 "name": "test2",
 "contact": "12321312312",
 "email": '[email protected]',
 "address": 'test address 2'
}]
$.each(data, function (i, h) {
   if (h.status === "true") {
      h.status = "<label class=\"label\" style=\"background-color: #b2c4aa;color:white\">Waiting</label>";
   } else {
     h.status = "<label class=\"label\" style=\"background-color: #FF8668;color:white\">Done</label>";
  }
  var $tr = $("<tr/>").attr('style', 'font-size:90%');
  $("<td/>").html(h.id).appendTo($tr);
  $("<td/>").html(h.name).appendTo($tr);
  $("<td/>").html(h.contact).attr('style', 'text-align:center').appendTo($tr);
  $("<td/>").html(h.email).attr('style', 'text-align:center').appendTo($tr);
  $("<td/>").html(h.address).appendTo($tr);
  $("<td/>").html(h.status).attr('style', 'text-align:center').appendTo($tr);
  $("<td/>").html("<span class=\"hostEditBtn\" data-host-name=\""+h.name+"\" data-toggle=\"modal\" data-target=\"#editEventHostModal\"><button class=\"btn btn-sm\" style=\"background-color:#b2c4aa;color:white\" data-toggle=\"tooltip\" title=\"Edit\"><span class=\"glyphicon glyphicon-pencil\"></span> Edit</button></span>").attr('style', 'text-align:center').appendTo($tr);
  $tr.appendTo($table);
});
                
                
                
$(".hostEditBtn").on('click', function () {
    $("#editEventHostModal #hostName").val($(this).attr('data-host-name'));
});
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>



<table id="hostTable">
</table>

<div id="editEventHostModal" class="modal fade" role="dialog">
  <div class="modal-dialog">

    <!-- Modal content-->
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal">&times;</button>
        <h4 class="modal-title"></h4>
      </div>
      <div class="modal-body">
        <input type="text" id="hostName" />
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
      </div>
    </div>

  </div>
</div>

person Vishal Taj PM    schedule 27.03.2018
comment
Вау спасибо большое чувак. Я просто скопировал и вставил ваш код в свой проект и сделал несколько настроек на основе моих собственных данных, и он работал как по маслу. Не знаю как, но это работает. Ваше здоровье! - person turing042; 27.03.2018

Попробуй это:

 $('body').on('click', '#hostEditBtn', function () {
      var attrValue = $(this).attr('data-host-name')
      $("#hostName").val(attrValue);
   });
person John Wink    schedule 27.03.2018
comment
Спасибо за ответ, я пробовал, но не получилось. - person turing042; 27.03.2018
comment
Проверить нет. элементов, которые вы получаете на $('#hostEditBtn'). Он возвращает один элемент или массив? - person John Wink; 27.03.2018
comment
Как проверить нет. элементов, которые я получаю? Кроме того, мне пришлось внести несколько изменений, как указал @VishalTajPM, и я изменил #hostEditBtn на .hostEditBtn. - person turing042; 27.03.2018
comment
Спасибо, @CalvinNunes. Я понял, что мог бы предоставить больше информации. Во всяком случае, он нашел решение. Я счастлив. - person John Wink; 27.03.2018
comment
Я предоставил свой ответ, думая, что вы поддерживаете Id 'hostEditBtn' UNIQUE на странице. Итак, Mine — прикрепить событие к динамически добавляемым элементам. @VishalTajPM дал вам подробное объяснение, что я имею в виду. - person John Wink; 27.03.2018