Вместо того, чтобы бросать код на вас, есть два понятия, которые являются ключом к пониманию того, как JS обрабатывает обратные вызовы и асинхронность. (это даже слово?)
Есть три вещи, о которых вам нужно знать; Очередь; цикл события и стек
. В широких упрощенных терминах цикл событий подобен диспетчеру проекта, он постоянно прослушивает любые функции, которые хотят запускать и взаимодействовать между очереди и стека.
while (queue.waitForMessage()) {
queue.processNextMessage();
}
Как только он получает сообщение для запуска чего-то, он добавляет его в очередь. Очередь - это список вещей, которые ждут выполнения (например, ваш запрос AJAX). Представьте себе это так:
1. call foo.com/api/bar using foobarFunc
2. Go perform an infinite loop
... and so on
Когда одно из этих сообщений будет исполнено, оно выталкивает сообщение из очереди и создает стек, стек - это все, что нужно выполнить JS для выполнения инструкции в сообщение. Таким образом, в нашем примере ему говорят позвонить foobarFunc
function foobarFunc (var) {
console.log(anotherFunction(var));
}
. Так что все, что foobarFunc должно выполнить (в нашем случае anotherFunction
), будет вставлено в стек. исполняемый, а затем забытый - цикл события затем переместится на следующую вещь в очереди (или прослушивает сообщения)
. Главное здесь - порядок выполнения. Это
Когда вы совершаете вызов с использованием AJAX для внешней стороны или выполняете любой асинхронный код (например, setTimeout), Javascript зависит от ответ, прежде чем он сможет продолжить.
Большой вопрос, когда он получит ответ? Ответ в том, что мы не знаем, поэтому цикл событий ждет, когда это сообщение скажет: «Эй, забери меня». Если JS просто ждал этого сообщения синхронно, ваше приложение замерзнет, и оно сосать. Таким образом, JS продолжает выполнение следующего элемента в очереди, ожидая, пока сообщение не будет добавлено обратно в очередь.
Вот почему с асинхронной функциональностью мы используем вещи, называемые обратными вызовами. Это похоже на обещание буквально. Как и в I , обещание что-то вернуть в какой-то момент jQuery использует специальные обратные вызовы, называемые deffered.done
deffered.fail
и deffered.always
(среди других). Вы можете увидеть их все здесь
Итак, вам нужно передать функцию, которая в какой-то момент будет выполнена с переданными ей данными.
Поскольку обратный вызов не выполняется немедленно, но в более позднее время важно передать ссылку на функцию, которую она не выполнила. поэтому
function foo(bla) {
console.log(bla)
}
, поэтому большую часть времени (но не всегда) вы пройдете foo
не foo()
. Надеюсь, это будет иметь смысл. Когда вы сталкиваетесь с такими вещами, которые кажутся запутанными, я настоятельно рекомендую полностью прочитать документацию, чтобы хотя бы понять ее. Это сделает вас намного лучшим разработчиком.
Вы уже дали один ответ: вы всегда можете просто перебрать всех детей и удалить их. Если вы считаете, что у вас слишком много дочерних узлов, возможно, вы захотите заменить узел svg на пустой. Если ваш узел svg имеет некоторые атрибуты, вы можете использовать тег, в который вы помещаете все дочерние узлы, а затем просто заменяете узел пустым.
Я пробовал svg.text("")
и, похоже, работает. Очищает весь внутренний текст, сохраняет атрибуты.
использовать это? http://keith-wood.name/svg.html
есть также raphael: jQuery SVG vs. Raphael
У меня возникнет соблазн пробиться и посмотреть, кто они делают .destroy()
.
Я согласен использовать клон и заменяю элемент клонированным.
Только один код строки:
svg.parentNode.replaceChild(svg.cloneNode(false), svg);
Если вы используете jQuery, вы можете просто сделать
$("#svgid").empty();
. Этот удаляет все дочерние элементы svg, оставляя без изменений другие атрибуты, такие как ширина и высота.
element = document.getElementById("elementID");
element.parentNode.removeChild(element);
У меня появилась идея из http://www.carto.net/svg/manipulating_svg_with_dom_ecmascript/
Использовать d3.js. Это приведет к удалению всех узлов содержимого из svg.
svg.selectAll("*").remove();
Вы можете использовать клон и заменить элемент клонированным.
var parentElement = svg.parentElement
var emptySvg = svg.cloneNode(false);
parentElement.removeChild(svg);
parentElement.appendChild(emptySvg);
Это будет добавление svg в конце, вы можете захотеть получить элемент до и добавить гармонический