Làm cách nào để xóa hoặc thay thế nội dung SVG?


200

Tôi có một đoạn mã JavaScript tạo (sử dụng D3.js) một svgphần tử có chứa biểu đồ. Tôi muốn cập nhật biểu đồ dựa trên dữ liệu mới đến từ dịch vụ web bằng AJAX, vấn đề là mỗi lần tôi nhấp vào nút cập nhật, nó sẽ tạo một cái mới svg, vì vậy tôi muốn xóa cái cũ hoặc cập nhật nội dung của nó.

Đây là đoạn trích từ hàm JavaScript nơi tôi tạo svg:

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

Làm cách nào tôi có thể xóa svgphần tử cũ hoặc ít nhất thay thế nội dung của nó?



1
@ Felix Kling Cảm ơn :) chức năng xóa khỏi D3.js đã giải quyết nó var svg1 = d3.select ("svg") .remove ();
Sami

1
bạn có thể sử dụngd3.select("svg").empty();
csandreas1

Câu trả lời:


282

Đây là giải pháp:

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

Đây là một removechức năng được cung cấp bởi D3.js.


110
thực sự nếu bạn muốn loại bỏ các phần tử khỏi svg thì tốt hơn nên sử dụng : svg.selectAll("*").remove();. Điều này rõ ràng nội dung của phần tử ngay cả khi đặt svgbiến thành một phần tử nhóm ( g).
Nux

4
@Nux vì bạn tôi đi đúng giờ hôm nay. d3.html ('') không hoạt động trong Safari.
glyph

Cảm ơn, tuy nhiên nếu tôi xóa một biểu đồ và sau đó ngay lập tức thử thêm một biểu đồ mới, nó không được thêm vào? Bất kỳ đề nghị, cảm ơn bạn.
mã hóabbq

Đoạn mã trên loại bỏ toàn bộ phần tử svg có chứa biểu đồ. bạn sẽ cần phải tạo một phần tử svg mới để thêm một biểu đồ mới tôi đoán.
Sami

Kỳ lạ là lỗi Safari vẫn tồn tại. Họ nên vá điều đó.
Tyguy7

149

Nếu bạn muốn thoát khỏi tất cả trẻ em,

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

sẽ loại bỏ tất cả nội dung liên quan đến các Svg.

Lưu ý : Điều này được khuyến nghị trong trường hợp bạn muốn cập nhật biểu đồ.


9
Tôi khuyên bạn nên điều này nếu bạn muốn cập nhật một biểu đồ. Loại bỏ con cái của họ sau đó nối thêm những cái mới.
Matheus Araujo

Tôi đã sử dụng câu trả lời này để giải quyết vấn đề của mình, câu trả lời này xóa tất cả nội dung được tạo trong thẻ svg và tôi có thể cập nhật biểu đồ của mình sau khi xóa nội dung
Hamed R

Điều này sẽ loại bỏ bất kỳ người nghe sự kiện liên quan, được chỉ định cho trẻ em trong SVG?
Anuroop Pendela

58

Đặt thuộc tính id khi nối thêm phần tử svg cũng có thể cho phép d3 chọn để loại bỏ () sau phần tử này theo id:

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

...

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

3
đây là một giải pháp an toàn / sạch hơn nhiều so với giải pháp được chọn làm câu trả lời. bằng cách chọn svg bằng id, người ta có thể tránh làm rối các thành phần svg khác có thể tồn tại trên cùng một trang. xin vui lòng upvote này.
Quest Monger

Tôi đã sử dụng điều này trong quá khứ và đây là một giải pháp chính xác. Thêm một id cũng ghi lại các nút.
Barshe Roussy

31

Tôi đã có hai biểu đồ.

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

Điều này loại bỏ tất cả các biểu đồ.

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

Điều này hoạt động để xóa biểu đồ thanh hiện có, nhưng sau đó tôi không thể thêm lại biểu đồ thanh sau

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

Đã thử điều này. Nó không chỉ cho phép tôi loại bỏ biểu đồ thanh hiện có mà còn cho phép tôi thêm lại biểu đồ thanh mới.

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 + ')');

Không chắc chắn nếu đây là cách chính xác để loại bỏ và thêm lại biểu đồ trong d3. Nó hoạt động trong Chrome, nhưng chưa được thử nghiệm trên IE.


6

Tôi đang sử dụng SVG bằng D3.js và tôi gặp vấn đề tương tự.

Tôi đã sử dụng mã này để loại bỏ các Svg trước đó nhưng gradient tuyến tính bên trong SVG không xuất hiện trong IE

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

sau đó tôi đã viết đoạn mã dưới đây để giải quyết vấn đề

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

Ở đây tôi đang loại bỏ g và đường dẫn trước đó bên trong SVG, thay thế bằng cái mới.

Giữ độ dốc tuyến tính của tôi bên trong các thẻ SVG trong nội dung tĩnh và sau đó tôi đã gọi mã ở trên, Điều này hoạt động trong IE


6

Bạn cũng có thể chỉ cần sử dụng jQuery để xóa nội dung của div có chứa svg của bạn.

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

12
Không phải là một ý tưởng tuyệt vời để sử dụng jQuery cho thao tác DOM khi bạn đang sử dụng một công cụ tuyệt vời cho công việc này trong D3. Đặc biệt là nếu bạn không sử dụng jQuery.
Warren Reilly

4

Bạn nên sử dụng append("svg:svg"), không append("svg")để D3 tạo thành phần có 'không gian tên' chính xác nếu bạn đang sử dụng xhtml.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.