【问题标题】:Cannot select pass the first <td> element with dynamic content无法选择传递具有动态内容的第一个 <td> 元素
【发布时间】:2021-09-01 20:39:30
【问题描述】:

我正在尝试对选定的动态元素进行 onclick 删除,但由于某种原因,它每次只选择第一个元素。

// Function to delete entries
$("#timesheet").on('click', '.delRow', function () {
    const firstUrl = "API LINK..."
    const secondUrl = document.getElementById("timesheetDetailsID").innerText
    console.log(secondUrl)
    const settings = {
        "async": true,
        "crossDomain": true,
        "url": JSON.stringify(firstUrl + secondUrl),
        "method": "DELETE",
        "headers": {
            "Content-Type": "application/json"
        },
        "processData": false,
        success: function () {
            alert("Yay")
        },
        error: function () {
            //error handler
            alert("Boo")
        }
    };
    $.ajax(settings).done(function (response) {
        console.log(response);
    });
});

HTML 页面示例: Example of the HTML

//Dynamic HTML 
const htmlTemplate = `
    <tr id = "testDeleteTimesheet">
      <td>${entry.hours}</td>
<td id = "timesheetDetailsID" style = "display: none;">${entry.timesheetDetailsId}</td>
      <td>${chartDate}</td>
      <td>${entry.contractCode}</td>
      <td>${entry.activityCode}</td>
      <td>${entry.otFlag}</td>
      <td>${entry.notes}</td>
      

<td><button id=\"edit-" + counter + "\" class=\"btn editRow btnStyle btn-primary btn-sm\"><span class=\ "bi bi-pencil\"></span></button> 
<button id=\"delete-" + counter + "\" class=\"btn delRow btnStyle btn-danger btn-sm\"><span class=\"bi bi-eraser\"></span></button></td>
    </tr>
    `;

这是我的静态 html 动态内容的目标

//.html page
 <table class="table" id="timesheet">
     <thead>
        <tr>
          <th scope="col">Hours</th>
          <th scope="col">Date</th>
          <th scope="col">ContractCode</th>
          <th scope="col">Activity Code</th>
          <th scope="col">OT</th>
          <th scope="col">Notes</th>
          <th scope="col" id="rowBtns"></th>
        </tr>
   </thead>
<tbody id="tsdata"></tbody>
</table>

【问题讨论】:

  • “只选择第一个元素”具体是什么意思?你的 HTML 是什么,特别是这段代码中的什么操作产生了意想不到的结果?
  • 您需要共享 HTML 以获得更好的答案。但我相信您正在选择具有重复 id 值的组件。你应该按类名选择,看看它是否适合你。
  • 您正在调用$("#timesheet"),这是带有id="timesheet" 的元素。一个 id 只需要分配给一个元素。因此,如果您有多个具有相同 ID 的元素,jQuery 只会带回它找到的第一个元素。
  • @Steve timesheet 位于 .html 文件中,该文件是所有动态 的包装器
  • @Zurez 抱歉,我刚刚用我的 html 更新了问题。

标签: javascript html jquery ajax


【解决方案1】:

您在 HTML 中多次重复使用相同的 id 值。如果您有多个带有id="timesheetDetailsID" 的元素,那么您希望document.getElementById("timesheetDetailsID") 返回哪个元素,为什么?由于 ID 应该是唯一的,因此浏览器在找到 ID 时会停止查找。

使用class 而不是id

<tr class="testDeleteTimesheet">
  <td>${entry.hours}</td>
  <td class="timesheetDetailsID" style="display: none;">${entry.timesheetDetailsId}</td>
  <!-- etc. -->

然后在您的点击处理程序中,从 $(this) 遍历 DOM 以找到该特定行所需的元素:

const secondUrl = $(this).closest('tr.testDeleteTimesheet').find('td.timesheetDetailsID').text();

这将从被点击的元素开始,使用.closest() 向上遍历到父&lt;tr&gt; 元素,然后使用.find() 向下遍历到预期的&lt;td&gt; 元素,然后获取该元素的文本。

【讨论】:

  • 我刚刚尝试使用您的方法,但第二个网址返回为空白我不知道为什么
  • @Gabe:Works for me.你能证明这个问题吗?
  • 非常抱歉,这是我的一个错误导致它无法工作。您的代码效果很好!非常感谢
【解决方案2】:

如果您有更多时间表,则必须使用班级而不是 ID。

【讨论】:

    【解决方案3】:

    下面是一个工作示例:

    const data = [{
        hours: 8,
        timesheetDetailsId: '/url/1',
        contractCode: 'NT/00008',
        activityCode: 'TEST',
        otFlag: false,
        notes: 'Test Test Test'
      },
      {
        hours: 8,
        timesheetDetailsId: '/url/2',
        contractCode: 'NT/00008',
        activityCode: 'TEST',
        otFlag: false,
        notes: 'Test Test Test'
      },
      {
        hours: 8,
        timesheetDetailsId: '/url/3',
        contractCode: 'NT/00008',
        activityCode: 'TEST',
        otFlag: false,
        notes: 'Test Test Test'
      },
      {
        hours: 8,
        timesheetDetailsId: '/url/1',
        contractCode: 'NT/00008',
        activityCode: 'TEST',
        otFlag: false,
        notes: 'Test Test Test'
      },
      {
        hours: 8,
        timesheetDetailsId: '/url/4',
        contractCode: 'NT/00008',
        activityCode: 'TEST',
        otFlag: false,
        notes: 'Test Test Test'
      },
    
    ];
    
    const chartDate = '1-Sep-2021';
    let counter = 0;
    
    
    data.forEach(entry => {
      counter++;
      const htmlTemplate = `
    <tr id = "testDeleteTimesheet">
        <td>${entry.hours}</td>
        <td class="timesheetDetailsID" style = "display: none;">${entry.timesheetDetailsId}</td>
        <td>${chartDate}</td>
        <td>${entry.contractCode}</td>
        <td>${entry.activityCode}</td>
        <td>${entry.otFlag}</td>
        <td>${entry.notes}</td>
        <td>
          <button id="edit-${counter}" class="btn editRow btnStyle btn-primary btn-sm">
            <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-pencil" viewBox="0 0 16 16">
              <path d="M12.146.146a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1 0 .708l-10 10a.5.5 0 0 1-.168.11l-5 2a.5.5 0 0 1-.65-.65l2-5a.5.5 0 0 1 .11-.168l10-10zM11.207 2.5 13.5 4.793 14.793 3.5 12.5 1.207 11.207 2.5zm1.586 3L10.5 3.207 4 9.707V10h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.293l6.5-6.5zm-9.761 5.175-.106.106-1.528 3.821 3.821-1.528.106-.106A.5.5 0 0 1 5 12.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.468-.325z"/>
            </svg>
          </button> 
          <button id="delete-${counter}" class="btn delRow btnStyle btn-danger btn-sm">
            <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-eraser" viewBox="0 0 16 16">
              <path d="M8.086 2.207a2 2 0 0 1 2.828 0l3.879 3.879a2 2 0 0 1 0 2.828l-5.5 5.5A2 2 0 0 1 7.879 15H5.12a2 2 0 0 1-1.414-.586l-2.5-2.5a2 2 0 0 1 0-2.828l6.879-6.879zm2.121.707a1 1 0 0 0-1.414 0L4.16 7.547l5.293 5.293 4.633-4.633a1 1 0 0 0 0-1.414l-3.879-3.879zM8.746 13.547 3.453 8.254 1.914 9.793a1 1 0 0 0 0 1.414l2.5 2.5a1 1 0 0 0 .707.293H7.88a1 1 0 0 0 .707-.293l.16-.16z"/>
            </svg>
          </button>
        </td>
    </tr>`;
    
      $(`#tsdata`).append(htmlTemplate)
    })
    
    $(`.delRow`).on(`click`, function(){
      const tr = $(this).closest(`tr`);
      const timesheetDetailsID = tr.find(`.timesheetDetailsID`);
      console.log(timesheetDetailsID.text())
      tr.remove();
    })
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
    
    <table class="table" id="timesheet">
      <thead>
        <tr>
          <th scope="col">Hours</th>
          <th scope="col">Date</th>
          <th scope="col">ContractCode</th>
          <th scope="col">Activity Code</th>
          <th scope="col">OT</th>
          <th scope="col">Notes</th>
          <th scope="col" id="rowBtns"></th>
        </tr>
      </thead>
      <tbody id="tsdata"></tbody>
    </table>

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签