คำตอบที่ได้รับการยอมรับการแสดงความซับซ้อนเกินไปวิธี ดังที่ Forresto อ้างในคำตอบของเขา " ดูเหมือนว่าจะเพิ่มไว้ใน DOM explorer แต่ไม่ปรากฏบนหน้าจอ " และเหตุผลสำหรับสิ่งนี้คือเนมสเปซที่แตกต่างกันสำหรับ html และ svg
วิธีแก้ปัญหาที่ง่ายที่สุดคือ "รีเฟรช" svg ทั้งหมด หลังจากต่อท้ายวงกลม (หรือองค์ประกอบอื่น ๆ ) ให้ใช้สิ่งนี้:
$("body").html($("body").html());
นี่เป็นการหลอกลวง วงกลมอยู่บนหน้าจอ
หรือถ้าคุณต้องการใช้ div คอนเทนเนอร์:
$("#cont").html($("#cont").html());
และห่อ svg ของคุณใน div คอนเทนเนอร์:
<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>
ตัวอย่างการใช้งาน:
http://jsbin.com/ejifab/1/edit
ข้อดีของเทคนิคนี้:
- คุณสามารถแก้ไข svg ที่มีอยู่ (ซึ่งมีอยู่แล้วใน DOM) เช่น สร้างโดยใช้ราฟาเอลหรืออย่างในตัวอย่างของคุณ "ฮาร์ดโค้ด" โดยไม่ต้องใช้สคริปต์
- คุณสามารถเพิ่มโครงสร้างองค์ประกอบที่ซับซ้อนเป็นสตริงเช่น
$('svg').prepend('<defs><marker></marker><mask></mask></defs>');
เหมือนที่คุณทำใน jQuery
- หลังจากองค์ประกอบถูกต่อท้ายและทำให้มองเห็นได้บนหน้าจอโดยใช้
$("#cont").html($("#cont").html());
คุณลักษณะของพวกเขาสามารถแก้ไขได้โดยใช้ jQuery
แก้ไข:
เทคนิคดังกล่าวใช้งานได้กับ "hard coded" หรือ DOM manipulated (= document.createElementNS ฯลฯ ) SVG เท่านั้น หาก Raphael ใช้สำหรับการสร้างองค์ประกอบ (ตามการทดสอบของฉัน) การเชื่อมโยงระหว่างวัตถุ Raphael กับ SVG DOM $("#cont").html($("#cont").html());
จะใช้งานไม่ได้หากใช้ วิธีหลีกเลี่ยงปัญหานี้ไม่ควรใช้$("#cont").html($("#cont").html());
เลยและใช้เอกสาร SVG แทน
หุ่นจำลองนี้เป็นตัวแทนฉบับต้นฉบับของเอกสาร SVG และมีองค์ประกอบที่จำเป็นเท่านั้น ถ้าเราต้องการเช่น ในการเพิ่มองค์ประกอบตัวกรองลงในเอกสารของราฟาเอลหุ่นจำลองอาจเป็นอะไร<svg id="dummy" style="display:none"><defs><filter><!-- Filter definitons --></filter></defs></svg>
ก็ได้ การแสดงข้อความต้นฉบับจะถูกแปลงเป็น DOM ครั้งแรกโดยใช้ $ ("body") ของ jQuery วิธีการผนวก () และเมื่อองค์ประกอบ (ตัวกรอง) อยู่ใน DOM ก็สามารถสอบถามได้โดยใช้วิธีการ jQuery มาตรฐานและผนวกเข้ากับเอกสาร SVG หลักซึ่งสร้างโดย Raphael
ทำไมต้องใช้หุ่นนี้ ทำไมไม่เพิ่มองค์ประกอบตัวกรองลงในเอกสารที่สร้างโดย Raphael อย่างเคร่งครัด หากคุณลองใช้เช่น $("svg").append("<circle ... />")
มันถูกสร้างขึ้นเป็นองค์ประกอบ HTML และไม่มีอะไรบนหน้าจอตามที่อธิบายไว้ในคำตอบ แต่ถ้าเอกสาร SVG ทั้งหมดต่อท้ายเบราว์เซอร์จะจัดการการแปลงเนมสเปซขององค์ประกอบทั้งหมดในเอกสาร SVG โดยอัตโนมัติ
ตัวอย่างทำให้เข้าใจเทคนิค:
// 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)");
สาธิตการทำงานเต็มรูปแบบของเทคนิคนี้อยู่ที่นี่: http://jsbin.com/ilinan/1/edit
(ฉันยังไม่รู้) ทำไม$("#cont").html($("#cont").html());
ไม่ทำงานเมื่อใช้ Raphael มันจะเป็นการแฮ็คที่สั้นมาก)
RMB
>edit as html
บนแท็ก html และกด Enter ทุกอย่างจะปรากฏขึ้น (แต่ผู้ฟังกิจกรรมทั้งหมดหายไป) หลังจากอ่านคำตอบนี้ฉันเปลี่ยนการเรียกใช้ createElement เป็น createElementNS และตอนนี้ทุกอย่างใช้ได้ผล!