【问题标题】:How to find parent element and remove child element text of that parent in jquery?如何在jquery中找到父元素并删除该父元素的子元素文本?
【发布时间】:2012-10-26 13:21:24
【问题描述】:

这是我使用的标记

<table cellpadding="0" cellspacing="0" border="0">
        <thead>
            <tr class="tr-head">
                <th>Amount Owed</th>
                <th>Amount Paid</th>
                <th>Check / Cash / Online</th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            <tr class="row0">
                <td>$10 <input type="text" name="amount_owed" id="amount_owed" value="10" style="display: none; width: 40px;" /></td>
                <td>$20 <input type="text" name="amount_paid" id="amount_paid" value="20" style="display: none; width: 40px;" /></td>
                <td>$30 <input type="text" name="check_cash_online" id="check_cash_online" value="30" style="display: none; width: 40px;" /></td>
                <td><a href="javascript:void(0);" class="edit-row" title="row0">Edit</a></td>
            </tr>
            <tr class="row1">
                <td>$10 <input type="text" name="amount_owed" id="amount_owed" value="10" style="display: none; width: 40px;" /></td>
                <td>$20 <input type="text" name="amount_paid" id="amount_paid" value="20" style="display: none; width: 40px;" /></td>
                <td>$30 <input type="text" name="check_cash_online" id="check_cash_online" value="30" style="display: none; width: 40px;" /></td>
                <td><a href="javascript:void(0);" class="edit-row" title="row1">Edit</a></td>
            </tr>
        </tbody>
    </table>

当我单击特定行的编辑时,我想删除前三个子单元格 td 文本(即 10 美元、20 美元......),但 input 元素除外。输入类型应在隐藏单元格文本后显示。请帮助我如何使用 jquery 脚本制作它。谢谢

我已经尝试了一些脚本来做到这一点,即

$(document).ready(function(){
            $('.edit-row').click(function(){
                    var title = $(this).attr('title');
                    $('.'+title+' td').text('');
                });
        });

但上面的脚本使单元格为空。

【问题讨论】:

  • 好问题,顺便说一句!有很多人对 jQuery 非常满意,但对原生 JavaScript 和直接 DOM 操作不太满意。这个问题可能会帮助很多人弥合这一差距。

标签: jquery jquery-ui jquery-selectors


【解决方案1】:

此代码将为您工作:

​$('.edit-row​​').click(function() {
    $(this).closest('tr').find('td').not(':last')
        .contents().filter(
            function() {
                return this.nodeType == 3;
            }).remove();
});​

经过测试here

Zachary Kniebel 使用 .contents() 方法

抱歉,我忘记了显示输入元素的部分:

$('.edit-row').click(function() {
    $(this).closest('tr').find('td').not(':last').contents()
        .filter(
            function() {
                return this.nodeType != 3;
            })
        .show().parent().contents()
        .filter(
            function() {
                return this.nodeType == 3;
            }).remove();
});​

经过测试并且可以正常工作。

【讨论】:

  • 是的,这绝对是这个解决方案最简单的版本——我在我的中添加了 for 循环,以防万一他或其他读者想要更多地自定义它。我建议的唯一一件事是删除 :last 选择器并使用循环查找前三个 - 这个数字将来可能会改变
  • 如果将来单元格的数量发生变化,最好使用 :last,因为这更有可能是包含 edit 的单元格链接,你不觉得吗?
  • 在这种情况下,你绝对是对的。但是,在其他情况下,我认为根据数量或位置选择您要查找的单元格可能会更好,因为编辑按钮可能不会停留在原来的位置。我的编码风格是编写所有内容,以便我可以在未来的场景中以最少的修改来适应它。
  • 顺便说一句,对显示输入的调用很好。我也忘了那个。
  • 另一种好方法是将一个类添加到具有输入的单元格并对其进行操作,而不是 :last 选择器和您建议的循环:)
【解决方案2】:

查找 jQuery 的 .contents() 方法。它将返回调用元素/集合的所有文本、元素和内容节点。您要做的是创建一个过滤器方法,如下所示:

var filterNodes = function() {
    return this.nodeType === 1 || this.nodeType === 3;
}

这将返回所有元素和文本节点。从那里,选择要从中删除文本的元素节点并删除文本节点。

注意:.contents() 方法返回 CHILDREN 而不是 DESCENDANTS

编辑:

我重新阅读了您的问题,我认为这更适合您:

  1. 使用标准 jQuery 选择器循环遍历前三个 td
  2. 运行以下过滤方法,只获取文本节点:

    var filterNodes = function () { return this.nodeType == 3; }

  3. 像这样调用过滤器方法:

    var firstThreeTDs = ....

    var nodeSet = firstThreeTDS.contents().filter(filterNodes).toArray();

    for (var i = 0; i &lt; nodeSet.length; i++) {

        nodeSet[i].parentNode.removeChild(nodeSet[i]);`
    

    }

  4. 使用.show()方法、.css()方法或效果方法(淡入淡出、滑动等)显示输入框


编辑 2:

有一个替代解决方案,但它不是最好的,它未经测试,并且需要大量的调试时间(特别是因为您可能会丢失一些属性/属性,基于您的实现):您可以使用 jQuery 的 @ 987654333@ 方法,复制每个td 中的输入元素,然后使用.html() 方法将td 的内部HTML 设置为该复制的输入元素。这不是一个好的解决方案,开销更大,而且有点新手,但如果您不喜欢手动操作 DOM,它会起作用。


如果您需要更多帮助/说明,请告诉我。祝你好运! :)

【讨论】:

  • 抱歉格式化 - 列表中的格式化代码在 SO 上有点困难
【解决方案3】:
$('.row0 #amount_owed,.row0 #amount_paid,row0 #check_cash_online').remove();

【讨论】:

  • 这将与 nilesh1006 想要的相反。
【解决方案4】:
    $('.edit-row').click(function(){
       $(this).parents("tr").find('td').not(":last").hide().html("");
    });

http://jsfiddle.net/bLygN/2/

【讨论】:

  • 第一个将隐藏整个单元格,第二个将清除所有 html - 这不是提问者想要的 - 他只希望文本消失,但输入框留
  • 差不多,但每个td 也应该有一个文本框,不应该与文本一起删除(美元金额)
  • 当每个单元格都被清除时,您希望仍然有一个输入元素 - 您在正确的轨道上,但是当您单击“编辑”时,您仍然希望看到输入框
猜你喜欢
  • 2018-01-17
  • 2018-11-08
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-10
  • 2019-12-12
相关资源
最近更新 更多