jQuery 动态表单选择器

jQuery Selector for Dynamic Form

我有以下 table 实际上封装了一个动态表单。我需要 select .check class Rmk 列 table 并打印 Hello Worldblur() 事件上针对该行的任何输入字段。 在我创建新行之前,它绝对可以正常工作。当我创建一个新行时,它不能 select class。有什么帮助吗?

function myCreateFunction() {
    var table = document.getElementById("myTable");
   var c = document.getElementById("myTable").rows.length;
 
  var row = table.insertRow(c);
  var cell1 = row.insertCell(0);
  var cell2 = row.insertCell(1);
  cell1.innerHTML = "<input type='text' class='lat' name='lat[]' /><span class='availability'></span>";
  cell2.innerHTML = "<input type='text' class='long' name='long[]' /><span id='availability'></span>";
    
}
function myDeleteFunction() {
 var cd = document.getElementById("myTable").rows.length;
 if(cd<=3)
 {
  //do nothing
 }
 else{
  document.getElementById("myTable").deleteRow(cd-1);
 }
}

$('input').on('blur', function() {
    var t = $(this);
    t.closest('tr').find('.check').text('Hello World');
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form action="form-handler.php" method="POST">
<table id="myTable">
        <tr>
            <th class="theader"> Lat </th>
            <th class="theader"> Long </th>
            <th class="theader"> Rmk </th>
        </tr>
        <tr>
            <td class="troe"> <input type='text' class='lat' name='lat[]' /> </td>
            <td class="trow"> <input type='text' class='long' name='long[]' /> </td>
            <td class="trow">
            <span class="check"></span> 
            </td>
        </tr>
        <tr>
            <td class="troe"> <input type='text' class='lat' name='lat[]' /> </td>
            <td class="trow"> <input type='text' class='long' name='long[]' /> </td>
            <td class="trow">
            <span class="check"></span> 
            </td>
        </tr>
        <tr>
            <td class="troe"> <input type='text' class='lat' name='lat[]' /> </td>
            <td class="trow"> <input type='text' class='long' name='long[]' /> </td>
            <td class="trow">
            <span class="check"></span> 
            </td>
        </tr>
    </table>
    <button class="myBtn" type="submit" id='submit' name="submit" value="submit">submit</button>
</form>
<br/>
<button onclick="myCreateFunction()">Create New Row </button>
<button onclick="myDeleteFunction()">Delete Row</button>

如建议的那样,部分答案与 Event binding on dynamically created elements 有关,我完全同意写评论的人仔细阅读该评论以及有关事件委托的官方文档。

无论如何,这不是完整的答案,因为您需要在动态创建新行时更正代码。基本上,您不会使用在 blur 事件中使用的 <span>、class check 创建第三个 td 元素。

最后是这样的:

function myCreateFunction() {
    var table = document.getElementById("myTable");
   var c = document.getElementById("myTable").rows.length;
 
  var row = table.insertRow(c);
  var cell1 = row.insertCell(0);
  var cell2 = row.insertCell(1);
  var cell3 = row.insertCell(2);
  cell1.innerHTML = "<input type='text' class='lat' name='lat[]' /><span class='availability'></span>";
  cell2.innerHTML = "<input type='text' class='long' name='long[]' /><span id='availability'></span>";
  cell3.innerHTML = "<span class='check'></span>";
    
}
function myDeleteFunction() {
 var cd = document.getElementById("myTable").rows.length;
 if(cd<=3)
 {
  //do nothing
 }
 else{
  document.getElementById("myTable").deleteRow(cd-1);
 }
}

$(document).on('blur', '#myTable input', function() {
    var t = $(this);
    t.closest('tr').find('.check').text('Hello World');
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form action="form-handler.php" method="POST">
<table id="myTable">
        <tr>
            <th class="theader"> Lat </th>
            <th class="theader"> Long </th>
            <th class="theader"> Rmk </th>
        </tr>
        <tr>
            <td class="troe"> <input type='text' class='lat' name='lat[]' /> </td>
            <td class="trow"> <input type='text' class='long' name='long[]' /> </td>
            <td class="trow">
            <span class="check"></span> 
            </td>
        </tr>
        <tr>
            <td class="troe"> <input type='text' class='lat' name='lat[]' /> </td>
            <td class="trow"> <input type='text' class='long' name='long[]' /> </td>
            <td class="trow">
            <span class="check"></span> 
            </td>
        </tr>
        <tr>
            <td class="troe"> <input type='text' class='lat' name='lat[]' /> </td>
            <td class="trow"> <input type='text' class='long' name='long[]' /> </td>
            <td class="trow">
            <span class="check"></span> 
            </td>
        </tr>
    </table>
    <button class="myBtn" type="submit" id='submit' name="submit" value="submit">submit</button>
</form>
<br/>
<button onclick="myCreateFunction()">Create New Row </button>
<button onclick="myDeleteFunction()">Delete Row</button>

我建议做起来容易一些:

用行制作一个隐藏的小片段,使其更容易使用。

<table id="table-row-source" style="display:none">
    <tr>
        <td class="troe"> <input type='text' class='lat' name='lat[]' /> </td>
        <td class="trow"> <input type='text' class='long' name='long[]' /> </td>
        <td class="trow">
            <span class="check"></span>
        </td>
    </tr>
</table>

这会将您的 myCreateFunction 变成这样:

function myCreateFunction() {
    $("#myTable").append($('#table-row-source').html());
    InitializeInputEventBlur();
}

然后我会将模糊事件处理程序变成一个函数,该函数在文档准备就绪时以及每次您创建新行以恢复键时调用。

function InitializeInputEventBlur() {
    $('input').on('blur', function () {
        var t = $(this);
        t.closest('tr').find('.check').text('Hello World');
    });
}

$(document).ready(function () {
    InitializeInputEventBlur();
});