【问题标题】:Uncaught TypeError: Cannot read property 'textContent' of null未捕获的类型错误:无法读取 null 的属性“textContent”
【发布时间】:2020-08-06 04:27:42
【问题描述】:

我看过类似的问题,但他们说这是因为 js 在 html 之前被调用,但我认为在我的代码中,一旦加载了所有 html,就会调用元素。

<table id="UserCards">
  <tr>
    <th width=20%><strong>Card Holder</strong></th>
    <th width=20%><strong>Card Number</strong></th>
    <th width=10%><strong>Expiry Date</strong></th>
    <th width=10%><strong>CVC</strong></th>
    <th width="5%"></th>
  </tr>
  {% for row in rows %}
      <tr>
        <td id="name">{{ row['CardName']}}</td>
        <td id="number">****************</td>
        <td class="realnumber" style="display:none;">{{ row['CardNo'] }}</td>
        <td id="date">{{ row['CardExpDate'] }}</td>
        <td id="code">***</td>
        <td id="realcode" style="display:none;">{{ row['CardSecretCode'] }}</td>
        <td><a href="#" class="delete-row" onclick="deleteThis(this)"><span class="fas fa-trash-alt"></span></a></td>
      </tr>
  {% endfor %}
</table>
function deleteThis(obj){
      var cardnumber = $(obj).siblings('.realnumber')[0].textContent;
      $(obj).closest('tr').remove();
      $.ajax({
        type: 'POST',
        url: "{{ url_for('deleterow') }}",
        contentType: "application/json",
        data: JSON.stringify({ number: cardnumber }),
        dataType: "json",
        success: function(response){
          window.location.href = 'http://127.0.0.1:5000/Drunkfy/Home/Paymentdetails';;
        },
        error: function(error){
            console.log(error);
        }
      });
    }

【问题讨论】:

  • 您似乎正在删除带有$(obj).closest('tr').remove()&lt;tr&gt;,这意味着带有id="realnumber"&lt;tr&gt; 中的元素也将被删除。你看到那里的问题了吗?
  • 只是我,还是其他人关心将完整的卡片细节渲染到 DOM 中?
  • 它不会处理真实数据,它只是用于我需要为学校做的一个项目。渲染需要更高级的知识

标签: javascript html


【解决方案1】:

deleteThis 方法的第一行是删除整个包装 tr 元素,这也会删除其中的元素。所以 - 如果列表中只有 1 项 - 当它到达第二行代码时 IS NO tdidrealnumber 不再存在。

尝试将第二行向上移动,以便在删除 tr 之前检索它。

  var cardnumber = document.getElementById('realnumber').textContent;
  $(obj).closest('tr').remove();

此外,您在列表中重复的元素上使用id,这意味着页面上可能有多个&lt;td&gt; 元素与realnumber 中的相同id。您应该解决此问题,否则document.getElementById始终返回页面上的第一个realnumber td,无论您要删除哪个。

考虑将其切换到一个类,然后使用 jquery 来查找它:

  var cardnumber = $(obj).parent().siblings('.realnumber')[0].textContent;
  $(obj).closest('tr').remove();

【讨论】:

  • 也许吧,但你怎么知道上面提到的tr 是目标?!
  • 方法内的第一行代码使用thisa元素)和closest来查找与tr的css选择器匹配的第一个父级。然后它调用 remove 就可以了。因此,似乎a 元素 - 在点击时 - 会寻找并销毁它包含的表格行。
  • 他使用了$(obj).closest('tr').remove(),或者我看到的是他的代码未经编辑的版本!再次可能是,他正在删除整个 tr 元素,但直到你知道 obj 是什么或者看到你不能确定的方法调用
  • 您可以在问题的第一个代码块的第 17 行看到方法调用。 :) onclick="deleteThis(this)"
  • @metrallador10 我明白我做了什么。 .realnumber td 不是被点击的asibling。这是一个……“叔叔”xD。只需先获取.parent(),然后搜索它的兄弟姐妹。我已经更新了答案。
猜你喜欢
  • 2016-01-03
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 2022-01-19
  • 2021-12-01
  • 2022-07-02
  • 2022-06-14
相关资源
最近更新 更多