2013-07-20 86 views
0

我想实现一个简单的拖放和拖动,如果有其他方法实现它,不需要鼠标放下,鼠标移动和鼠标事件。原因是因为在我拖放鼠标事件之前,我的鼠标向上事件触发了页面上的附加事件。我不知道如何让它适应火灾,所以我正在寻找替代方法。实现拖放

+0

你可以有一个布尔'isDragging',在mouseMove事件中将其设置为'true',并在mouseUp事件中检查其状态以确定适当的行为? – kevinsa5

+1

如果您使用jQuery附加事件,则应按照它们附加的顺序触发。我们可以看到你的代码吗? – 2013-07-20 16:57:34

+0

第一只鼠标上挂在我的面前。当用户在div上单击(鼠标按下)时,我的魔方才会被连接。另外,我在鼠标上设置的鼠标移动不会被'$(element).off(“mousemove”)'移除。 –

回答

3

你可以尝试使用jQuery UI的http://jqueryui.com/draggable/http://jqueryui.com/droppable/达到你想要什么,两者的结合可以让你做了很多,它很容易为文档有一些例子来上手,你可以找到很多这样的例子一个:http://www.elated.com/articles/drag-and-drop-with-jquery-your-essential-guide/

使其在移动设备(触摸事件)兼容使用此脚本。让jQuery UI的手机兼容:touchpunch.furf.com

我做了一个的jsfiddle,显示你如何使用jQuery UI的可弃和可拖动的例子:

http://jsfiddle.net/mMDLw/2/

// jquery closure 
(function($, window, undefined) { 

    // on dom ready 
    $(function() { 

     initializeDropzone(); 

     initializeDraggables(); 

    }); 

    /** 
    * 
    * intializing the dropzone element 
    * 
    */ 
    var initializeDropzone = function() { 

     // initialize the dropzone to make the dropzone a droppable element 
     // http://jqueryui.com/droppable/ 
     $('#dropzone').droppable({ 
      accept: '.foo', // only elements with this class will get accepted by the dropzone 
      hoverClass: 'drop_hover', // css class that should get applied to the dropzone if mouse hovers over element 
      greedy: true, 
      drop: function onDrop(event, ui) { 

       console.log('#dropzone drop'); 

       var droppedElement = ui.draggable; 

       console.log(droppedElement); 

       // create an object and fill it with data we extract from element that got dropped 
       var droppedElementData = {}; 

       droppedElementData.id = parseInt(droppedElement.attr('data-foo-id')); 
       droppedElementData.name = droppedElement.text(); 

       var dropLogElement = $('#dropLog').find('ul'); 

       droppedElementData.position = dropLogElement.children().length + 1; 

       // create the list html to add a row about the dropped element to our log 
       var rowHtml = ''; 
       rowHtml += '<li id="' + droppedElementData.position + '_' + droppedElementData.id + '">'; 
       rowHtml += '<span class="position">' + droppedElementData.position + ') </span>'; 
       rowHtml += '<span class="name">' + droppedElementData.name + '</span>'; 
       rowHtml += '</li>'; 

       var row = $(rowHtml); 

       // append the new row to the log 
       dropLogElement.append(row); 

      } 

     }); 

    }; 

    /** 
    * 
    * intializing draggable elements 
    * 
    */ 
    var initializeDraggables = function() { 

     // http://jqueryui.com/draggable/ 

     // make all elements that have the class "foo" draggable 
     $('#droppables').find('.foo').draggable({ 
      refreshPositions: true, // refresh position on mouse move, disable if performance is bad 
      revert: function(event) { 

       console.log('a "foo" got dropped on dropzone'); 

       // if element is dropped on a dropzone then event will contain 
       // an object, else it will be false 
       if (event) { 

        // the event exists, this means the draggable element got dropped inside of the dropzone 
        console.log('YEP the event is not false'); 

        // the element that is being dropped 
        var draggedElement = $(this); 

        // add explosion effect to dragged element 
        draggedElement.effect(
          'explode', 
          1000, 
          function() { 

           console.log('drop scale effect finished'); 

           console.log(draggedElement); 

           // put the element back to its original position 
           draggedElement.css('left', '0'); 
           draggedElement.css('top', '0'); 

           // make the element visible again by fading it in 
           draggedElement.show('fade', {}, 1000); 

          } 
        ); 

        return false; 

       } else { 

        // false because draggable element got dropped outside of the dropzone 
        console.log('NOPE no object, the event is false'); 

        return true; 

       } 

      }, 
      start: function(event, ui) { 

       // the user started dragging an element 
       console.log('#droppables .foo drag start'); 

      }, 
      stop: function(event, ui) { 

       // the user has released the draggable element 
       console.log('#droppables .foo drag stop'); 

      } 
     }); 

     // make all elements that have the class "bar" draggable (but the dropzone wont accept them) 
     $('#nonDroppables').find('.bar').draggable(
      { 
       revert: true, // if the element did not get dropped in the dropzone or not accepted by it, then revert its position back to its original coordinates 
       start: function(event, ui) { 

        // the user started dragging an element 
        console.log('#nonDroppables .bar drag start'); 

       }, 
       stop: function(event, ui) { 

        // the user has released the draggable element 
        console.log('#nonDroppables .bar drag stop'); 

       } 
      } 
     ); 

    }; 

})(jQuery, window); 
+0

jQuery的触摸设备可以工作吗?刚刚查看了文档,这是鼠标事件。 –

+2

不,它没有,但有github上的脚本,使jquery ui mobilde兼容:http://touchpunch.furf.com/,我用我自己不是很久以前,它的工作很好 – chrisweb

+1

我已经添加了一个例子如何使用jQuery UI可拖动和可拖拽 – chrisweb