jQuery для перетаскивания элемента и удаления из панели анимированного списка

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

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

Вопрос:

У меня есть список перетаскиваемых значков PNG, которые можно поместить в область над div тем, что их содержит. Содержимое div используется .animate для скольжения вниз, для сворачивания, при нажатии кнопки табуляции.

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

Как я могу отделить перетаскиваемые элементы от основного списка после удаления, при этом все еще позволяя перемещать их перетаскиванием (и, возможно, возвращать обратно в нижний контейнер, если не требуется)?

Моя структура списка в контейнере / лотке:

     <div class="BottomToolsTray">
    <div class="IconsTrayTab">
    <div>
    <a href="#"><img src="images/contract_btn.png" class="OpenIconsBtn" data-toggleon="images/contract_btn.png" data-toggleoff="images/expand_btn.png" border="0" /></a>
    </div>
    <div class="IconsTrayLabel">
    Icons Tray
    </div>
    </div>
    <div class="TextLabelsTab">
    Text Labels
    </div>
    <div class="ArrowsTab">
    Arrows
    </div>
    <div class="IconsPanelBox">
    </div>
</div>

<div class="IconGraphics">
     <ul class="clear">
    <li class="item" data-id="1">
                <a href="#">
                    <img src="images/Complex.png" alt="Complex">
                </a>
            </li>
            <li data-id="2">
                <a href="#">
                    <img src="images/Simple.png" alt="Simple">
                </a>
            </li>

            <li data-id="3">
                <a href="#">
                    <img src="images/2_3rd_IT_spend.png" alt="">
                </a>
            </li>
     </ul>
</div>
  

И вот моя часть Javascript

 <script>

    //Instructions Min/Max buttons

    $(document).ready(function(){

    //Icons Tray Min/Max buttons   

        $(".OpenIconsBtn").on('click',function(){
      if($(this).attr('src')==$(this).data('toggleon')){
       $(this).attr('src',$(this).data('toggleoff'))
       $(".BottomToolsTray").animate({"top":"57.3%"},500, function() {
          //$(".IconGraphics").show();
          $(".IconGraphics").fadeIn(100);
        });


       //SLIDE UP TOP BAR WHEN TOOL EXPANDED
       $(".instructions").slideUp(300);
       $(".ToptoggleBtn").attr('src',$(".ToptoggleBtn").data('toggleoff'))


      }else{
       $(this).attr('src',$(this).data('toggleon'))
          $(".IconGraphics").fadeOut(80);
       $(".BottomToolsTray").animate({"top":"579px"},500);
      }
    });
});


    //!-------------------------JQuery DRAG FUNCTION---------------------------------------//

    $(function () {

        // jQuery UI Draggable
        $(".IconGraphics li").draggable({
                      revert:false,
            drag:function () {
                $(this).addClass("active");
                $(this).closest(".IconGraphics").addClass("active");
            },

            // removing the CSS classes once dragging is over.
            stop:function (event, ui) {
                               $(this).removeClass("active").closest(".IconGraphics").removeClass("active");
            }
        });
                    $(".PageArea").droppable({
            tolerance:"touch",
            drop:function (event,ui) {
                var draggable = ui.draggable;
                var id = draggable.attr("data-id");
            }
        });
    });
</script>
  

И вот мой JSFiddle.

Вот обновление… Теперь это работает в IE 9, за исключением того, что удаленные объекты привязываются к верхнему левому краю, когда я хочу, чтобы они просто падали там, где они были отброшены. Проблема с lerger заключается в том, что после переключения на использование помощника и клонирования перемещение объектов, которые были удалены, перестало работать на iPad. Кто-нибудь может предложить помощь, чтобы исправить это? Я не уверен, что это конфликт js с сенсорным управлением или проблема в моем коде, которая не нравится iPad.

     Here's what I have:

    Top of script for js


    <head>
    <link rel="stylesheet" href="js/master.css">
    <script src="js/jquery-1.8.3.min.js"></script>
    <script src="js/jquery-ui-1.9.0.custom.min.js"></script>
    <script src="js/jquery.ui.touch-punch.min.js"></script>
    <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
    </head>

    <body>
    <div class="AppContainer">
    <div class="WhiteboardList">

    </div>


    <div class="IconGraphics">
    <ul class="clear">
        <li>
            <a href="#">
                <img src="images/Complex.png" alt="Complex">
            </a>
        </li>
        <li>
            <a href="#">
                <img src="images/Simple.png" alt="Simple">
            </a>
        </li>

        <li>
            <a href="#">
                <img src="images/2_3rd_IT_spend.png" alt="">
            </a>
        </li>
    </ul>
    </div>
    </div>


    <script>

    $(document).ready(function(){
var clone;
var a = 1;
    $(".IconGraphics li").draggable({
    helper: 'clone',
    cursor: 'hand'
    });

    $(".WhiteboardList").droppable({
                accept: ".IconGraphics li",
               // hoverClass: 'dropareahover',
                tolerance: 'pointer',
                drop: function(event, ui)
                {

          var dropElemId = ui.draggable.attr("id");

          var dropElem = ui.draggable.html();

                  clone = $(dropElem).clone(); // clone it and hold onto the jquery object
          clone[0].id = "newId" [a  ];
          var newObject = clone[0].id;
          newObject.id = "newObject";
          $('#newId').css('position', 'absolute');
          $('#newId').css('float', 'left');

          //

          clone.draggable({
    containment: 'parent',
    cursor: 'crosshair',
    stack: 'div',
    zIndex: '2500',

    });

                  $(this).append(clone);

           }
        });
    });
    </script>
  

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

1. вы пробовали клонировать элемент после его удаления и заменять текущий элемент клонированным?

2. Привет, Аджит, спасибо за ваш ответ. Я поиграл с помощником и клонировал, но не смог заставить его работать, а также сделать так, чтобы клонированный элемент можно было перемещать, после удаления или перетаскивать обратно в лоток / контейнер, если в этом нет необходимости. Я смог прикрепить перетаскиваемый элемент к другому div на экране при удалении и удалить его из исходного контейнера div, но опять же, его нельзя переместить или переместить обратно в исходный контейнер. Вроде как застрял здесь.

3. Ну, я подозреваю, что причина, по которой вы не можете выбрать клонированный элемент, заключается в проблемах с селектором. Попробуйте выбрать его следующим образом $( document ).on( "ready", "<your id or class>", function() { //Do stuff });

4. Спасибо Adjit. Как вы можете сказать, я довольно новичок в jQuery. Я попробовал это с помощью моего метода добавления перетаскиваемого объекта к родительскому, но все еще не могу переместить перемещаемый объект при перетаскивании. Будет ли ваш предложенный выше код работать только с решением для клонированных объектов? Сталкивались ли вы с какими-либо хорошими примерами того, что я пытаюсь сделать? ДО сих пор я не нашел ничего подобного, поэтому я начинаю задаваться вопросом, возможно ли это.

5. Привет, Аджит… Мне удалось заставить метод clone работать в IE, но теперь он перестал работать на iPad при перемещении удаляемого объекта.