Các câu trả lời được chấp nhận chương trình quá phức tạp cách. Như Forresto tuyên bố trong câu trả lời của mình , " dường như có thêm chúng trong trình thám hiểm DOM, nhưng không phải trên màn hình " và lý do cho điều này là các không gian tên khác nhau cho html và svg.
Cách giải quyết đơn giản nhất là "làm mới" toàn bộ svg. Sau khi nối thêm vòng tròn (hoặc các yếu tố khác), hãy sử dụng:
$("body").html($("body").html());
Đây là mẹo. Vòng tròn nằm trên màn hình.
Hoặc nếu bạn muốn, hãy sử dụng div container:
$("#cont").html($("#cont").html());
Và bọc Svg của bạn bên trong div container:
<div id="cont">
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 100" width="200px" height="100px">
</svg>
</div>
Ví dụ về chức năng:
http://jsbin.com/ejifab/1/edit
Ưu điểm của kỹ thuật này:
- bạn có thể chỉnh sửa svg hiện có (đã có trong DOM), vd. được tạo bằng Raphael hoặc giống như trong ví dụ của bạn "mã hóa cứng" mà không cần kịch bản.
- bạn có thể thêm các cấu trúc phần tử phức tạp như các chuỗi, ví dụ.
$('svg').prepend('<defs><marker></marker><mask></mask></defs>');
giống như bạn làm trong jQuery.
- sau khi các phần tử được nối thêm và hiển thị trên màn hình bằng
$("#cont").html($("#cont").html());
các thuộc tính của chúng có thể được chỉnh sửa bằng jQuery.
BIÊN TẬP:
Kỹ thuật trên chỉ hoạt động với "mã hóa cứng" hoặc DOM được thao tác (= document.createEuityNS, v.v.) chỉ SVG. Nếu Raphael được sử dụng để tạo các phần tử, (theo thử nghiệm của tôi), liên kết giữa các đối tượng Raphael và SVG DOM bị phá vỡ nếu $("#cont").html($("#cont").html());
được sử dụng. Cách giải quyết cho vấn đề này là hoàn toàn không sử dụng $("#cont").html($("#cont").html());
và thay vào đó nó sử dụng tài liệu SVG giả.
SVG giả này trước tiên là một đại diện văn bản của tài liệu SVG và chỉ chứa các yếu tố cần thiết. Nếu chúng ta muốn ví dụ. để thêm một phần tử bộ lọc vào tài liệu Raphael, hình nộm có thể giống như thế <svg id="dummy" style="display:none"><defs><filter><!-- Filter definitons --></filter></defs></svg>
. Biểu diễn văn bản trước tiên được chuyển đổi sang DOM bằng phương thức $ ("body"). Append () của jQuery. Và khi phần tử (bộ lọc) có trong DOM, nó có thể được truy vấn bằng các phương thức jQuery tiêu chuẩn và được thêm vào tài liệu SVG chính được tạo bởi Raphael.
Tại sao hình nộm này là cần thiết? Tại sao không thêm một phần tử bộ lọc vào tài liệu đã tạo của Raphael? Nếu bạn thử nó bằng cách sử dụng ví dụ. $("svg").append("<circle ... />")
, nó được tạo dưới dạng phần tử html và không có gì trên màn hình như được mô tả trong câu trả lời. Nhưng nếu toàn bộ tài liệu SVG được nối thêm, thì trình duyệt sẽ tự động xử lý chuyển đổi không gian tên của tất cả các thành phần trong tài liệu SVG.
Một ví dụ khai sáng kỹ thuật:
// Add Raphael SVG document to container element
var p = Raphael("cont", 200, 200);
// Add id for easy access
$(p.canvas).attr("id","p");
// Textual representation of element(s) to be added
var f = '<filter id="myfilter"><!-- filter definitions --></filter>';
// Create dummy svg with filter definition
$("body").append('<svg id="dummy" style="display:none"><defs>' + f + '</defs></svg>');
// Append filter definition to Raphael created svg
$("#p defs").append($("#dummy filter"));
// Remove dummy
$("#dummy").remove();
// Now we can create Raphael objects and add filters to them:
var r = p.rect(10,10,100,100);
$(r.node).attr("filter","url(#myfilter)");
Bản demo hoạt động đầy đủ của kỹ thuật này có tại đây: http://jsbin.com/ilinan/1/edit .
(Tôi vẫn chưa biết, tại sao $("#cont").html($("#cont").html());
không hoạt động khi sử dụng Raphael. Nó sẽ rất ngắn.)
RMB
>edit as html
trên thẻ html và nhấn enter, mọi thứ sẽ hiển thị (nhưng tất cả các trình lắng nghe sự kiện đều biến mất). Sau khi đọc câu trả lời này, tôi đã thay đổi các lệnh gọi createdEuity của mình thành createdEuityNS và bây giờ mọi thứ đều hoạt động!