Я использую гаджет Fish (http://abowman.com/google-modules/fish/) в CMS на основе вики, и мне нужно переместить гаджет с одного элемента HTML на другой. (Примечание: гаджет с рыбой является примером - проблема возникает и с другими гаджетами.)
Если я напрямую перемещаю гаджет с помощью базового класса гаджетов «ig_reset», то все работает. Если я попытаюсь изменить положение с помощью окружающей оболочки, то iframe, используемый гаджетом, по-видимому, возьмет верх. К сожалению, мне нужна гибкость изменения положения с помощью окружающей оболочки.
Похоже, это как-то связано с перемещением тега SCRIPT в DOM. Гаджет динамически создает сценарий и тег стиля. Если я Удалить динамически создаваемый тег скрипта из DOM, а затем переставляю оболочку в другое место в DOM, все работает хорошо. Если я попытаюсь передать тег сценария переехать другому элементу DOM, тогда возникнет исходная проблема. Итак, движущийся тег скрипта вокруг DOM, кажется, является причиной - независимо от того, когда происходит перемещение (даже после загрузки).
Я хотел бы понять, что здесь происходит, чтобы фрейм захватил страницу, а также найти лучшее решение, чем удаление динамически созданного тега скрипта.
Я поставил здесь тест: http://solidgone.com/jquery/google-gadget.html - в демонстрации используется jQuery, но я не думаю, что это связано с jQuery ...



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Каждый раз, когда вы добавляете элемент скрипта на страницу с помощью jQuery, он пытается выполнить его. Таким образом, когда вы перемещаете ig_reset (который представляет собой только таблицу - без скрипта), он работает без проблем. Когда вы пытаетесь переместить оболочку, содержащую сценарий, сценарий перемещается и повторно выполняется.
Мы работаем над исправлением этой проблемы с повторным выполнением в ядре jQuery, но пока что здесь происходит именно это.
Как отмечает Джон Ресиг, это является проблема jQuery. Вы можете убедиться в этом, заменив свой обработчик
$("#with-wrapper").click(function ()
{
$('.sidebar-content-wrapper').contents().appendTo($("#sidebar"));
});
с тем, который избегает использования методов jQuery для фактического перемещения каждого элемента:
$("#with-wrapper").click(function()
{
var sidebar = $("#sidebar")[0];
$('.sidebar-content-wrapper').contents().each(function()
{
// raw DOM method rather than jQuery's
// appendTo() -> domManip() -> execute script blocks behavior
sidebar.appendChild(this);
});
});
Я вижу, что он копирует DOM, а не перемещает его
@vsync: почему ты так говоришь?
Я вижу, как он копирует элементы (каждый цикл), но что происходит после? Я ожидаю, что убью исходный элемент, не так ли?
@vsync: здесь не происходит копирования элементов. См .: developer.mozilla.org/En/DOM/Node.appendChild
Мастер! может ты ответишь этот теоретический вопрос о своей замечательной библиотеке jQuery?