【问题标题】:jQuery: select all `<td>` of a `<tr>` except a particular `<td>`jQuery:选择一个`<tr>`的所有`<td>`,除了一个特定的`<td>`
【发布时间】:2018-06-30 11:55:34
【问题描述】:

我想选择所有单击的tr 中的td,除了具有输入复选框的td。以下代码允许我不选择具有输入字段的td:

$(".table-row td:not(:has(input))").click(function(){...}

但我无法访问另一个td 的值。

是什么导致了问题?如何选择除特定td 之外的所有td?

.html

<tr data-id="{{ test.id }}" class="table-row">
 <td class="form-check">
  <div class="form-check">
   <label class="form-check-label">
    <input class="form-check-input check-ele check-prevent" type="checkbox" value="">
    <span class="form-check-sign">
     <span class="check"></span>
    </span>
   </label>
  </div>
 </td>
 <td>{{ forloop.counter }}</td>
 <td name="test_name">{{ test.test_name}}</td>
 <td name="test_type">{{ test.test_type}}</td>
 <td name="test_date">{{ test.test_date|date:"m/d/Y" }}</td>  
</tr>  

jQuery

$(".table-row td:not(:has(input))").click(function(){
  $('#editModal').modal('show');
  let row = $(this).closest('tr').attr('data-id');
  var test_name = $(this).find('td[ name="test_name" ]').text();
  console.log(typeof(test_name));
  // return empty test_name. The row I click on has test_name with value `Entrance Exam`
  var test_type = $(this).find('td[ name="test_type" ]').text();
  var test_date = $(this).find('td[ name="test_date" ]').text();
  var date = new Date(test_date);
  var day = ("0" + date.getDate()).slice(-2);
  var month = ("0" + (date.getMonth() + 1)).slice(-2);
  var test_date = date.getFullYear()+"-"+(month)+"-"+(day) ;
  $('#edit_test_date').val(test_date);
  $("#edit_test_name").val(test_name);
  $("#edit_test_type").val(test_type);

【问题讨论】:

  • 如果td有一个输入元素/有索引0/有类.form-check/...
  • “但我无法访问其他 td 的值。” 那么您是如何尝试获取其他 td 的值的?请注意,您显示的 js 行只是设置了一个点击处理程序,与访问 td 的内容无关。
  • @PatrickEvans 我已经详细更新了我的帖子。请检查一下。谢谢
  • 将 find() 更改为 siblings() 或在行元素中使用 find()。您正在寻找其他 &lt;td&gt; 作为 this 的孩子,而这不是结构
  • 当我看到您的代码时,我认为您仅在有输入时才使用form-check 类,所以如果我没有错,您的选择器将是td:not(.form-check),这就是您要找的吗?

标签: javascript jquery html jquery-selectors


【解决方案1】:

您的选择器工作正常,正如您在以下示例中看到的那样,但是您错误地访问了其他 &lt;td&gt;s 的 值。这是另一种方法:

const cells = $(".table-row td:not(:has(input))");

cells.click((e) => {
  const row = e.target.parentElement;
  const [ name, type, date ] = Array.from(row.children).slice(2).map(cell => cell.getAttribute('name'));
  
  console.log(`NAME = ${ name }, TYPE = ${ type }, DATE = ${ date }`)
});
table {
  border-collapse: collapse;
  border: 3px solid black;
  width: 100%;
  text-align: center;
  font-family: monospace;
}

td {
  padding: 10px 20px;
}

td:not(:first-child) {
  cursor: pointer;
  border-left: 3px solid black;
}

td:not(:first-child):hover {
  background: yellow;
}

.as-console-wrapper {
  max-height: 44px !important;
}
<table>
  <tr class="table-row">
    <td>
      <div>
        <label>
          <input type="checkbox" value="">
        </label>
      </div>
    </td>
    <td name="counter1">Counter 1</td>
    <td name="name1">Name 1</td>
    <td name="type1">Type 1</td>
    <td name="date1">Date 1</td>  
  </tr>
  
  <tr class="table-row">
    <td>
      <div>
        <label>
          <input type="checkbox" value="">
        </label>
      </div>
    </td>
    <td name="counter2">Counter 2</td>
    <td name="name2">Name 2</td>
    <td name="type2">Type 2</td>
    <td name="date2">Date 2</td>  
  </tr>
  
  <tr class="table-row">
    <td>
      <div>
        <label>
          <input type="checkbox" value="">
        </label>
      </div>
    </td>
    <td name="counter3">Counter 3</td>
    <td name="name3">Name 3</td>
    <td name="type3">Type 3</td>
    <td name="date3">Date 3</td>  
  </tr>
</table>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

你的代码有问题:

let row = $(this).closest('tr').attr('data-id');
var test_name = $(this).find('td[ name="test_name" ]').text();

您应该选择实际行 (&lt;tr&gt;) 而不是其data-id 属性,然后使用该row 查找不同的单元格及其name 属性的值:

const row = $(this).closest('tr');
const test_name = row.find('td[name="name1"]').text();

【讨论】:

  • 我已经详细更新了我的帖子。我错误地访问了其他&lt;td&gt; 的值。
  • @Sokunthaneth 请看一下更新后的答案。简而言之,您需要在&lt;tr&gt; 上致电.find()。
猜你喜欢
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 2012-07-10
  • 2012-11-11
  • 2014-12-06
  • 2014-06-29
  • 1970-01-01
相关资源
最近更新 更多