Jquery перетаскиваемые клонированные разделы

#jquery #jquery-ui #clone #draggable #jquery-ui-draggable

#jquery #jquery-пользовательский интерфейс #клонирование #перетаскиваемый #jquery-пользовательский интерфейс-перетаскиваемый

Вопрос:

У меня проблема с реализацией моей веб-страницы с помощью jQuery. Я знаю, что будет трудно понять, что я пытаюсь сделать, но я постараюсь сделать это как можно более понятным (хотя мой английский не очень хорош).

У меня есть веб-страница с разделом, который можно перетащить внутрь «оболочки-оболочки», и я реализовал это, когда вы перетаскиваете его, вы получаете клон (копию) этого основного раздела, а затем вы можете перетаскивать этот клонированный раздел по экрану (внутри «оболочки-оболочки»). Каждый раз, когда вы перетаскиваете основной раздел, создается другой клонированный раздел. Это работает отлично.

Код:

 $(".tool").draggable({
        containment: "#containment-wrapper",
        helper: 'clone',
        stop: function(event, ui) {
                 if($num==null) $num=0; //treat a number for the id of the next cloned div
                 else $num  ;
                 $(ui.helper).clone(true).attr("id",$(this).attr("id") $num).removeClass('tool ui-draggable ui-draggable-dragging ui-widget-content').addClass('element ui-widget-content').appendTo('#containment-wrapper');
            }
    });
  

Проблема в том, что я должен реализовать, чтобы при загрузке этой веб-страницы, пользователь сохранял положение своего предыдущего подразделения на сервере: положение всех клонированных подразделений (я сохранил идентификатор основного подразделения и положение — сверху и слева).

Итак, я пытаюсь реализовать код, выполняемый непосредственно при загрузке страницы, который создает и размещает клонированные divs, сохраненные пользователем, на экране (внутри «containment-wrapper»).

Я получил это с помощью этого кода (у меня есть значения: $ id — идентификатор основного подразделения, $ left и $ top — позиция подразделения, которое я должен создать):

         var $obj = $("#" $id); //get the main div
        if($num==null) $num=0; //treat a number for the id of the next cloned div
        else $num  ;

        $obj.clone(true).attr("id",$id "_" $num).removeClass('ui-draggable ui-draggable-dragging ui-widget-content').addClass('ui-widget-content').appendTo('#containment-wrapper').css( { "position": "absolute", "left":$left   "px", "top":$top   "px" } );
  

Он создает клонированный div там, где я хочу, но моя большая проблема в том, что когда я пытаюсь перетащить этот клонированный div с помощью мыши, внутри перетаскиваемого этого div, начинает перетаскиваться основной div (тот, из которого я создаю клонированные div) и создается другой клонированный div. Таким образом, невозможно перетащить этот клонированный div, созданный моим кодом.

Я надеюсь, что возможно понять всю мою ситуацию и мою проблему… Есть идеи о том, как я мог бы это решить?

Я также пытался сделать что-то подобное (с его помощью я думал обработать позицию в функции перетаскиваемого события):

         var $obj = $("#" $id);
        $obj.trigger("mousedown.draggable", [ev]);
        ev.stopPropagation();
  

Но когда я отлаживаю его с помощью firebug (firefox pluggin), я вижу, что событие draggable никогда не выполняется.

Большое, очень большое спасибо за ваше время,

Aleix

Комментарии:

1. Добро пожаловать в StackOverflow! Ваш английский в порядке! Возможно ли для вас предоставить сжатый пример вашей проблемы на jsfiddle.net ?

2. почему бы вам просто не разрешить перетаскивать «основной div» вместо этого и оставить клон позади. Затем поменяйте идентификатор и добавьте прослушиватель событий в клон.

3. @Adrew: Я смотрю, как это работает «jsfiddle.net » потому что я не знал об этом и никогда им не пользовался. Когда я получу это, я скажу вам 😉 Спасибо! // @Yman: Спасибо за вашу идею. Я понимаю это, но я думаю, что если мне придется создать более одного клонированного div из основного, то у меня будет та же проблема… В любом случае, я могу попробовать, спасибо!

Ответ №1:

Я решил это! Код был в порядке, единственной проблемой был вызов функции initialize(), которая была ответственна за создание клонированных divs: я вызывал эту функцию с помощью этой строки кода (внутри кода JavaScript):

     window.onload = initialize;
  

Если я удалю эту строку и вызову initialize() функцию из $(document).ready функции, то все будет работать нормально !! 🙂

 $(document).ready(function() {
        [...]
        initialize();
        });
  

Я понял об этом, пытаясь упростить код в jsfiddle.net. Итак, глупая ошибка, но я так рад, что наконец-то решил ее 🙂

Большое, очень большое спасибо за ваши комментарии.