【问题标题】:How to Remove dynamic Parent <tr> via OnClick of child <input>如何通过子 <input> 的 OnClick 删除动态父 <tr>
【发布时间】:2011-08-26 05:27:20
【问题描述】:

我正在通过 Javascript 变量添加 &lt;tr&gt;

var txtBox = "<tr id='dynTR'><td><input type='text' class='textBoxes' /></td><td><input type='text' class='textBoxes' value='0' /></td><td><input type='button' value='-' /></td></tr>";

我的功能是:

function AddTR(table) {
            $(table).append(txtBox);
        }

我在 HTML 中的表格结构(连同函数的按钮)是:

<table id="tblTest" class="testTable">
            <thead>
                <tr>
                    <td>Product</td>
                    <td>Quantity</td>
                    <td>Remove TR</td>
                </tr>
            </thead>
            <tbody>

            </tbody>
        </table>
        <br />
        <input type="Button" id="btnTest" value="Add Table Row" onclick="AddTR($('#tblTest'))" />

那么我该如何在 jQuery 中使用 .remove() 函数来摆脱父标签而不意外删除所有 &lt;tr id='dynTR'&gt; 标签?

【问题讨论】:

    标签: javascript html jquery jquery-events dom-manipulation


    【解决方案1】:

    考虑到这个是删除按钮:

    <input type='button' value='-' />
    

    以下会做:

    $('#tblTest input[type="button"]').click(function () {
         $(this).closest('tr').remove();
    });
    

    我建议您使用 jQuery 事件处理程序,而不是使用内联 onclick 和朋友。 $(this) 是被点击按钮的 jQuery 对象,.closest() 会在按钮的父项中查找第一个tr,然后将其删除。

    jsFiddle by @ShadowWizard

    最好的方法是更改​​删除按钮的 HTML:

    <input type='button' value='-' class='removeButton' />
    

    所以你可以像这样定位你的删除按钮:

    $('#tblTest .removeButton').click(...
    

    这更好,因为在前面的示例中,表中每个可能的input type="button" 都会收到事件,即使我们只需要在这些特殊的事件上使用它(如果表中没有其他按钮,这不是问题)。

    【讨论】:

    • 很好,打算使用parent("td").parent("tr") 提供解决方案,你的方式显然更好。我也做了一个快速测试用例:jsfiddle.net/XP2Gf/1 :)
    • @Shadow 谢谢,让我把它放在我的答案中。
    • 我明白了,那我试试看。谢谢:)
    • 干杯 @baz 很高兴我也可以提供一些帮助。 :)
    • 太棒了!有效!我想我第一次尝试应用您的解决方案时错过了一些东西,但在第二次尝试后我得到了它。我想我只是错过了一些类/id 引用。
    【解决方案2】:

    bazmegakapa 答案应该可以解决问题。此外,您应该真正避免使用内联 Javascript,这通常是不好的做法。而是这样做:

    $('#btnTest').click(function() { AddTR($('#tblTest')); });
    

    为了跟上 jQuery 的惯例,使用元素对象的正确范围,你可以这样做:

    $('#btnTest').click(function() { AddTR.call($('#tblTest')[0]); });
    

    然后在您的 AddTR 函数中,您可以简单地将元素表引用为 this

    function AddTR() {
        $(this).append(txtBox);
    }
    

    它使事情保持可预测性并遵循相同的约定。


    等一下……

    理论上虽然AddTR() 函数正在添加一个表格行,但它有点误导,因为它所做的只是将一个元素附加到该上下文中。你真正想做的就是函数所说的; 添加一个表格行!而不是你做的

    var txtBox = "<tr id='dynTR'><td><input type='text' class='textBoxes' /></td><td><input type='text' class='textBoxes' value='0' /></td><td><input type='button' value='-' /></td></tr>";
    

    这是相当丑陋的,如果你改变你的表格行结构会导致一些变化。相反,请使用.clone 来帮助您:

    function AddTR() {
       $(this).append($('tr:last').clone());
    }
    

    见小提琴: http://jsfiddle.net/garreh/6NUK3/1/

    【讨论】:

    • +1 好建议。 jQuery 提供了一种非常简单的方法来附加事件处理程序。内联事件处理程序只会给您带来更多问题(并且行为不应进入 HTML 标记)。
    • 我明白了,谢谢你的建议。我在前端编程方面没有太多冒险,但是阅读您的 cmets 让我对前端开发有了更好的了解。
    • 没问题埃里克。很高兴你想了解更多关于前端和 jQuery 的知识,与它一起工作是一个梦想。我知道你已经接受了 baz 的答案,但无论如何我已经更新了我的答案,以便为你尝试做的事情提供更优化的方法。
    • 太棒了。虽然,我认为应该有一个条件,如果 与最后一个 不匹配,它不应该克隆而是创建该行。无论如何,这只是我,因为用户可以单击删除按钮并最终克隆标题 .
    • 通过一些结构上的改变,通过在&lt;thead&gt;部分正确添加标题&lt;th&gt;&lt;tbody&gt;内的表格主体,您可以使用:not(:first-child)轻松完成此操作选择器 -- 见这里:jsfiddle.net/garreh/6NUK3/4 -- 我已经添加了重置输入值的功能,因此在新添加的行上它是空的。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签