【问题标题】:how to delete a table cell in jqueryjquery如何删除表格单元格
【发布时间】:2014-06-17 09:49:13
【问题描述】:

点击display_removebutton时如何删除单元格并重新排列整个结构 这是我试图实现的代码。我试过$("td:empty").remove(); 但没用,它不工作 任何人都可以建议任何修改

 var int_loop =  1;
    var flag_tr = 1;
    $('#total').append("<table width=100%>"); 
    
    $(upfiles).each(function(index, file) 
    {
        display_removebutton = "<img width='20px' style='cursor:pointer;' height='20px' class='class_remove' data-id='"+int_loop+"' id='remove_"+int_loop+"' src='images/DeleteRed.png' />";
        if(flag_tr === 1 && int_loop ===1)
            $('#total').append("<tr>"); 
       else if(flag_tr === 6)
             $('#total').append("<tr>");
        $('#total').append("<td class='div_files' id='div_selec"+int_loop+"'><b>File Name :</b>"+file.name + display_removebutton+"</td>" ); 
        if(flag_tr === 6)
        {
              $('#total').append("</tr>");
              flag_tr = 1;
        } 
        $("#remove_"+int_loop).click(function() {
            //REMOVED FILES USING SPLICE SUCCESSFULLY
            
            //How do i remove cell here and rearrange the entire structure
            
            $("td:empty").remove(); //tried with this but no use, it is deleting the entire data in a div
        });
        int_loop++;
        flag_tr++;
    }

已编辑 1:

这里是jsfiddle

编辑 2: 我也在为打开和关闭的表格标签正确附加。因为 tr 和 tds 没有显示在表格标签中

【问题讨论】:

  • 这种类型的问题确实需要一个带有 HTML 的示例,最好是在 JSFiddle 中:)
  • 为什么-1能解释一下
  • 还需要什么信息..我会提供...我不能在这里发布整个代码,这不是一件好事...而且我已经清楚地说明了我的问题...仍然需要任何信息。我会提供
  • 好的,因为它是拖放输入文件上传..我还没有提供我可以提供的全部内容吗?
  • 在谷歌浏览器中运行它。右键单击任何元素并选择“检查元素”。这将在正确的位置打开 DOM 浏览器。享受:)

标签: jquery html each removechild


【解决方案1】:

这是您的 jsFiddle 的工作版本,其中包含示例数据和所有修复:

  • 您需要删除closest TD 才能单击按钮。
  • 您需要将TDs 附加到TRs 和
  • 您需要将TRs 附加到TABLE
  • 您还想要一个漂亮的过渡(添加了淡入淡出)
  • 您不想附加结束 &lt;/TR&gt; 元素(不需要)
  • 您应该为动态添加的元素使用委托事件

http://jsfiddle.net/TrueBlueAussie/dXwR8/9/

// Some sample data
var upfiles = [{
    name: "name1"
}, {
    name: "name2"
}, {
    name: "name3"
}, {
    name: "name4"
}, {
    name: "name5"
}, {
    name: "name6"
}, {
    name: "name7"
}

];

var int_loop = 1;
var flag_tr = 1;
$('#total').append("<table width=100%>");

$(upfiles).each(function (index, file) {
    display_removebutton = "<img width='20px' style='cursor:pointer;' height='20px' class='class_remove' data-id='" + int_loop + "' id='remove_" + int_loop + "' src='images/DeleteRed.png' />";
    if (flag_tr === 1 && int_loop === 1) {
        $('#total table').append("<tr>");
    } else if (flag_tr === 6) {
        $('#total table').append("<tr>");
    }
    $('#total tr:last').append("<td class='div_files' id='div_selec" + int_loop + "'><b>File Name :</b>" + file.name + display_removebutton + "</td>");
    if (flag_tr === 6) {
        $('#total').append("</tr>");
        flag_tr = 1;
    }
    int_loop++;
    flag_tr++;
});
$('#total').on('click', '[id^=remove_]', function () {
    var $td = $(this).closest('td');
    $td.fadeOut(function () {
        $td.remove();
    });
});

以下旧版本


更新:

DOM 结构无效。您不能将 TD 直接添加到表中。那必须在TR中。我将代码更改为始终添加到表中的最后一个 TR。

另一个更新 - 过渡:

JSFiddle:当然:jsfiddle.net/TrueBlueAussie/dXwR8/7

如果你想在remove之前有一个fade,记住元素在一个局部变量中,然后使用fadeOut()的回调来移除item。

    var $td = $(this).closest('td');
    $td.fadeOut(function(){ $td.remove(); });

另一个更新:委托事件

JSFiddle:http://jsfiddle.net/TrueBlueAussie/dXwR8/8/

balachandran 建议您对动态项目使用委托事件处理程序是非常正确的。它简化了代码。

$('#total').on('click', '[id^=remove_]', function () {
    var $td = $(this).closest('td');
    $td.fadeOut(function () {
        $td.remove();
    });
});

委托事件处理程序通过侦听所需元素的祖先来工作,然后当所选事件冒泡到该元素时,then 它应用 jQuery 选择器来查找所需的元素,then 它将函数应用到任何匹配的元素导致事件

如果您没有方便、不变的祖先,请使用 $(document).on,但不要使用 $('body').on,因为 body 有一些奇怪的副作用。

委托活动有几个好处:

  1. 简化和分离事件代码。
  2. 您无需为项目添加单个处理程序的开销。

最终更新:http://jsfiddle.net/TrueBlueAussie/dXwR8/9/

TRs 没有被附加到添加的 TABLE(而是附加到 DIV)

我将选择器更改为:

$('#total table').append("<tr>");

【讨论】:

  • 好的,整理了TR和TD的其他问题。它现在应该在每 5 个文件之后正确换行到一个新行。
  • 不知道“最近”,ty
  • 它还有一个$('#total').append("&lt;/tr&gt;");,它完全没有任何作用。您只能附加打开元素或匹配打开/关闭集,而不是单独关闭 &lt;/whatever&gt; 的元素。
  • 是否可以添加移除 td 的效果。就像我们 fadeOut 一样...这里可以吗
  • 如果您使用 jQuery $('&lt;element etc&gt;') 创建元素,那么它会自动创建元素节点(具有隐式打开和关闭)。 您不只是附加 HTML 文本。在 F12 Chrome 调试工具中检查 DOM! PS。您无需继续删除接受来引起我的注意(这很烦人)。 问吧! :)
【解决方案2】:

尝试删除每个函数内的事件绑定,并在此上下文中使用event-delegation

$('#total').on('click','[id^="remove_"]',function(){
  $(this).closest('tr').find('td:empty').remove();
});

【讨论】:

  • 更清洁,但他们正在在追加后为每个项目添加事件处理程序。
  • #total 是 div 不是单元格
  • @prassu 是静态父级,我们可以用它来委托事件...!
  • 按照您的建议尝试了不起作用..我已将 $("td:empty").remove(); 替换为您的
  • 正如我所说,这更干净(并且更受欢迎),但这不是他们提出的问题/问题。您还需要更好地解释它,因为prassu 显然不理解它(基于他们的it's a div 评论)。他们可能误用了您的代码 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 2021-07-14
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多