ฉันจะลบหรือแทนที่เนื้อหา SVG ได้อย่างไร


200

ฉันมีรหัส JavaScript ซึ่งสร้าง (โดยใช้ D3.js) svgองค์ประกอบที่มีแผนภูมิ ฉันต้องการอัปเดตแผนภูมิตามข้อมูลใหม่ที่มาจากบริการบนเว็บโดยใช้ AJAX ปัญหาคือทุกครั้งที่ฉันคลิกที่ปุ่มอัปเดตจะสร้างใหม่svgดังนั้นฉันจึงต้องการลบเก่าหรืออัปเดตเนื้อหา

นี่คือตัวอย่างจากฟังก์ชั่น JavaScript ที่ฉันสร้างsvg:

var svg = d3.select("body")
        .append("svg")
        .attr("width", w)
        .attr("height", h);

ฉันจะลบsvgองค์ประกอบเก่าหรืออย่างน้อยแทนที่เนื้อหาได้อย่างไร



1
@ Felix Kling ขอบคุณ :) ฟังก์ชั่นการลบจาก D3.js แก้ไขได้ var svg1 = d3.select ("svg") .remove ();
Sami

1
คุณสามารถใช้d3.select("svg").empty();
csandreas1

คำตอบ:


282

นี่คือทางออก:

d3.select("svg").remove();

นี่คือremoveฟังก์ชั่นที่จัดทำโดย D3.js


110
ที่จริงถ้าคุณต้องการลบองค์ประกอบออกจาก svg มันจะดีกว่าที่จะใช้: svg.selectAll("*").remove();. เนื้อหาที่ชัดเจนขององค์ประกอบแม้ว่าการตั้งค่าsvgตัวแปรเป็นองค์ประกอบการจัดกลุ่ม ( g)
Nux

4
@Nux เพราะคุณฉันจะไปตรงเวลาวันนี้ d3.html ('') ไม่ทำงานใน Safari
glyph

ขอบคุณอย่างไรก็ตามหากฉันลบแผนภูมิและลองเพิ่มแผนภูมิใหม่ทันทีจะไม่ได้รับการเพิ่มเข้ามา ข้อเสนอแนะใด ๆ ขอบคุณ
codingbbq

รหัสด้านบนจะลบองค์ประกอบ svg ทั้งหมดที่มีแผนภูมิ คุณจะต้องสร้างองค์ประกอบ svg ใหม่เพื่อเพิ่มแผนภูมิใหม่ฉันเดา
Sami

แปลกที่ข้อผิดพลาด Safari ยังคงมีอยู่ พวกเขาควรแก้ไขมัน
Tyguy7

149

หากคุณต้องการกำจัดเด็กทุกคน

svg.selectAll("*").remove();

จะลบเนื้อหาทั้งหมดที่เกี่ยวข้องกับ svg

หมายเหตุ : แนะนำให้ใช้ในกรณีที่คุณต้องการอัพเดทแผนภูมิ


9
ฉันแนะนำสิ่งนี้หากคุณต้องการอัพเดทแผนภูมิ นำลูก ๆ ของพวกเขาออกจากนั้นผนวกใหม่
Matheus Araujo

ฉันใช้คำตอบนี้เพื่อแก้ปัญหาของฉันคำตอบนี้ลบเนื้อหาทั้งหมดที่สร้างขึ้นภายในแท็ก svg และฉันสามารถปรับปรุงแผนภูมิของฉันหลังจากล้างเนื้อหา
Hamed R

สิ่งนี้จะลบผู้ฟังเหตุการณ์ที่เกี่ยวข้องซึ่งกำหนดให้กับเด็ก ๆ ใน SVG หรือไม่
Anuroop Pendela

58

การตั้งค่าแอตทริบิวต์ id เมื่อผนวกองค์ประกอบ svg ยังสามารถให้ d3 เลือกเพื่อลบ () ในภายหลังในองค์ประกอบนี้โดย id:

var svg = d3.select("theParentElement").append("svg")
.attr("id","the_SVG_ID")
.attr("width",...

...

d3.select("#the_SVG_ID").remove();

3
นี่เป็นคำตอบที่ปลอดภัยกว่า / สะอาดกว่าคำตอบที่เลือกไว้ โดยการเลือก svg โดยใช้ id เราสามารถหลีกเลี่ยงการทำให้เกิดความเสียหายกับองค์ประกอบ svg อื่น ๆ ที่อาจมีอยู่ในหน้าเดียวกัน โปรดลงคะแนนนี้
Quest Monger

ฉันเคยใช้สิ่งนี้ในอดีตและนี่เป็นทางออกที่แม่นยำ การเพิ่ม id ยังทำหน้าที่บันทึกโหนด
Christophe Roussy

31

ฉันมีสองแผนภูมิ

<div id="barChart"></div>
<div id="bubbleChart"></div>

สิ่งนี้ลบแผนภูมิทั้งหมด

d3.select("svg").remove(); 

สิ่งนี้ใช้สำหรับลบแผนภูมิแท่งที่มีอยู่ แต่หลังจากนั้นฉันไม่สามารถเพิ่มแผนภูมิแท่งได้อีก

d3.select("#barChart").remove();

พยายามนี้ ไม่เพียง แต่ให้ฉันลบแผนภูมิแท่งที่มีอยู่ แต่ยังให้ฉันเพิ่มแผนภูมิแท่งใหม่อีกครั้ง

d3.select("#barChart").select("svg").remove();

var svg = d3.select('#barChart')
       .append('svg')
       .attr('width', width + margins.left + margins.right)
       .attr('height', height + margins.top + margins.bottom)
       .append('g')
       .attr('transform', 'translate(' + margins.left + ',' + margins.top + ')');

ไม่แน่ใจว่านี่เป็นวิธีที่ถูกต้องในการลบและเพิ่มแผนภูมิอีกครั้งใน d3 ใช้งานได้ใน Chrome แต่ยังไม่ได้ทดสอบใน IE


6

ฉันใช้ SVG โดยใช้ D3.js และฉันมีปัญหาเดียวกัน

ฉันใช้รหัสนี้เพื่อลบ svg ก่อนหน้า แต่การไล่ระดับสีเชิงเส้นภายใน SVG ไม่ได้มาใน IE

$ ( "# container_div_id") HTML ( "");

จากนั้นฉันก็เขียนโค้ดด้านล่างเพื่อแก้ไขปัญหา

$('container_div_id g').remove();
$('#container_div_id path').remove();

ที่นี่ฉันกำลังลบ g และเส้นทางก่อนหน้าภายใน SVG แทนที่ด้วยอันใหม่

การเก็บการไล่ระดับสีเชิงเส้นของฉันภายในแท็ก SVG ในเนื้อหาแบบคงที่และจากนั้นฉันเรียกรหัสข้างต้นนี้ใช้งานได้ใน IE


6

คุณสามารถใช้ jQuery เพื่อลบเนื้อหาของ div ที่มี svg ของคุณ

$("#container_div_id").html("");

12
ไม่ใช่ความคิดที่ดีในการใช้ jQuery สำหรับการจัดการ DOM เมื่อคุณใช้เครื่องมือที่ยอดเยี่ยมสำหรับงานนี้ใน D3 แล้ว โดยเฉพาะอย่างยิ่งหากคุณไม่ได้ใช้ jQuery
Warren Reilly

4

คุณควรใช้append("svg:svg")ไม่ใช่append("svg")เพื่อให้ D3 สร้างองค์ประกอบด้วย 'เนมสเปซ' ที่ถูกต้องหากคุณใช้ xhtml

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.