У відповідь прийняті шоу занадто складним способом. Як стверджує Форресто у своїй відповіді , " це, мабуть, додає їх у провідник DOM, але не на екрані ", і причиною цього є різні простори імен для 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.
Редагувати:
Вищеописана методика працює лише з "жорстко кодованим" або маніпульованим DOM (= document.createElementNS і т.д.) SVG. Якщо для створення елементів використовується Рафаель, (за моїми тестами) зв'язок між об'єктами Рафаеля та SVG DOM порушується, якщо $("#cont").html($("#cont").html());
він використовується. Вирішення цього завдання - це взагалі не використовувати, $("#cont").html($("#cont").html());
а замість нього використовувати підроблений документ SVG.
Цей манекен SVG - це спочатку текстове подання документа SVG і містить лише необхідні елементи. Якщо ми хочемо, наприклад. щоб додати елемент фільтра до документа Рафаеля, манекен може бути чимось подібним <svg id="dummy" style="display:none"><defs><filter><!-- Filter definitons --></filter></defs></svg>
. Текстове подання спочатку перетворюється в DOM за допомогою методу $ ("body"). Append () jQuery. А коли елемент (фільтр) знаходиться в DOM, його можна запитувати за допомогою стандартних методів jQuery і додавати до основного документа SVG, який створює Рафаель.
Для чого потрібна ця пустушка? Чому б не додати елемент фільтра строго до створеного Рафаелем документа? Якщо ви спробуйте це, наприклад, $("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 і натисніть введіть все, що відображається (але всі слухачі подій зникають). Прочитавши цю відповідь, я змінив свої дзвінки createElement на createElementNS і тепер все працює!