jquery - วิธีที่เร็วที่สุดในการลบแถวทั้งหมดออกจากตารางขนาดใหญ่มาก


96

ฉันคิดว่านี่อาจเป็นวิธีที่รวดเร็วในการลบเนื้อหาของตารางขนาดใหญ่มาก (3000 แถว):

$jq("tbody", myTable).remove();

แต่ใช้เวลาประมาณห้าวินาทีในการดำเนินการใน firefox ฉันทำอะไรโง่ ๆ (นอกเหนือจากการพยายามโหลด 3000 แถวในเบราว์เซอร์)? มีวิธีที่เร็วกว่านี้ไหม

คำตอบ:


217
$("#your-table-id").empty();

เร็วที่สุดเท่าที่คุณจะได้รับ


อืม น่าผิดหวัง ฉันคิดว่าการลบจะเร็วกว่าการแทรก ทำให้ฉันอยากทำสิ่งที่น่าเกลียดจริงๆเช่นแค่ซ่อนตารางและสร้างตารางใหม่เมื่อฉันต้องการอัปเดต
morgancodes

10
ใช่แล้ว ... HTML ไม่ได้สร้างขึ้นเพื่อแสดง 3k แถวในหนึ่งหน้า :) คุณคิดวิธีแก้ปัญหาแบบแบ่งหน้าไม่ได้หรือ? นั่นจะทำให้เร็วขึ้นมาก แน่นอนว่าจะต้องทำงานมากขึ้น แต่จะเป็นประสบการณ์การใช้งานที่สมบูรณ์ยิ่งขึ้น
Seb

7
อันนี้ก็ดีนะ ปัญหานี้จะลบส่วนหัวของตารางด้วย
isuru

3
ลบส่วนหัว :(
Sandeep Kushwah

6
การดำเนินการนี้จะลบทุกอย่างในตารางรวมถึงส่วนหัวด้วย ฉันคิดว่า @morgancodes ต้องการลบเนื้อหาหรือที่เรียกว่าแถวไม่ใช่ส่วนหัว $('#mytable tbody').empty();สำหรับผู้ที่พบว่าการแก้ปัญหานี้ในภายหลังจะเป็น สิ่งนี้ทำให้มั่นใจได้ว่าจะมีเพียงคนที่ว่างเปล่า
OmniOwl

83

เป็นการดีกว่าที่จะหลีกเลี่ยงการวนซ้ำทุกประเภทเพียงแค่ลบองค์ประกอบทั้งหมดออกโดยตรงดังนี้:

$("#mytable > tbody").html("");

6
html("")โทรempty()ภายใน
Emile Bergeron

8
ทางออกที่ดีสำหรับฉันเพราะมันไม่ได้ลบส่วนหัวของตาราง ขอขอบคุณ!
Daria

@Daria ใช้ตัวเลือกให้เต็มที่ซึ่งจะทำให้ส่วนหัวของคุณอยู่ในตำแหน่ง: $ ('table tbody') ว่าง ();
Dani

อะไรคือความแตกต่างระหว่างการใช้ ("#mytable> tbody") และ ("#mytable tbody")
eaglei22

1
หากคุณมีตารางที่ซ้อนกันในแถวของตารางก็จะลบแท็ก tbody เหล่านั้นออกไปด้วย หากคุณมีเพียงโต๊ะเดียวก็ไม่น่าจะแตกต่างกันมากนัก
Shiroy


7

การใช้การแยกจะเร็วกว่าคำตอบอื่น ๆ ที่นี่:

$('#mytable').find('tbody').detach();

อย่าลืมใส่องค์ประกอบ tbody กลับเข้าไปในตารางตั้งแต่ถอดออก:

$('#mytable').append($('<tbody>'));  

นอกจากนี้ทราบว่าเมื่อพูดถึงประสิทธิภาพการใช้ไวยากรณ์จะเร็วกว่า$(target).find(child) $(target > child)ทำไม? ฉ่า!

เวลาที่ผ่านไปเพื่อว่างเปล่า 3,161 แถวตาราง

ใช้เมธอด Detach () (ดังที่แสดงในตัวอย่างด้านบน):

  • Firefox: 0.027 วินาที
  • Chrome: 0.027 วินาที
  • ขอบ: 1.73s
  • IE11: 4.02 วินาที

ใช้เมธอด empty ():

  • Firefox: 0.055 วินาที
  • Chrome: 0.052 วินาที
  • Edge: 137.99 วินาที (อาจถูกแช่แข็งเช่นกัน)
  • IE11: ค้างและไม่กลับมา

3

สองประเด็นที่ฉันสามารถดูได้ที่นี่:

  1. เมธอด empty () และ remove () ของ jQuery ทำงานได้ไม่น้อย ดูเหตุผลในการเรียกใช้ฟังก์ชัน JavaScriptของ John Resig

  2. อีกประการหนึ่งคือสำหรับข้อมูลแบบตารางจำนวนมากคุณอาจพิจารณาไลบรารีดาต้ากริดเช่นDataTables ที่ยอดเยี่ยมเพื่อโหลดข้อมูลของคุณได้ทันทีจากเซิร์ฟเวอร์เพิ่มจำนวนการโทรเครือข่าย แต่ลดขนาดของการโทรเหล่านั้น ฉันมีตารางที่ซับซ้อนมากซึ่งมี 1500 แถวที่ค่อนข้างช้าการเปลี่ยนเป็นตารางที่ใช้ AJAX ใหม่ทำให้ข้อมูลเดียวกันนี้ดูค่อนข้างเร็ว


ขอบคุณ artlung ทำอะไรแบบนั้นจริงๆรับข้อมูลทั้งหมดพร้อมกันจากเซิร์ฟเวอร์ แต่จะวาดแถวตารางเมื่อจำเป็นเท่านั้น
morgancodes

ฟังดูเป็นการโทรที่ดี ฉันสงสัยว่าการกังวลเกี่ยวกับจำนวนแถวในตารางในเบราว์เซอร์จะเป็นปัญหาหรือไม่หรือหากหน่วยความจำสำหรับคอมพิวเตอร์ส่วนใหญ่เพิ่มขึ้นสิ่งนี้ก็จะน้อยลง
artlung

หน่วยความจำไม่มีปัญหากับปริมาณข้อมูลที่ฉันกำลังโหลด คอขวดคือการจัดการ DOM
morgancodes

ฉันคิดว่าเรากำลังพูดในสิ่งเดียวกัน ยิ่งคุณโหลดข้อมูลมากเท่าไหร่คุณก็ยิ่งโหลดโหนด DOM มากขึ้นเท่านั้นสำหรับฉันสิ่งเหล่านี้เกี่ยวข้องกับหน่วยความจำที่จำเป็น ฉันหวังว่าสถานการณ์ของคุณจะดีขึ้นไม่ว่า
artlung

1

หากต้องการลบเร็วเท่านั้น.. ทำได้ดังนี้ ..

$( "#tableId tbody tr" ).each( function(){
  this.parentNode.removeChild( this ); 
});

แต่อาจมีองค์ประกอบที่เชื่อมโยงกับเหตุการณ์ในตาราง

ในกรณีนั้น,

โค้ดด้านบนไม่ได้ป้องกันหน่วยความจำรั่วใน IE ... TT และไม่เร็วใน FF ...

ขอโทษครับ ....



-2

คุณสามารถลองสิ่งนี้ ...

var myTable= document.getElementById("myTable");
if(myTable== null)
    return;
var oTBody = myTable.getElementsByTagName("TBODY")[0];
if(oTBody== null)
    return;
try
{
    oTBody.innerHTML = "";
}
catch(e)
{
    for(var i=0, j=myTable.rows.length; i<j; i++)
        myTable.deleteRow(0);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.