javascript - HTML5 drag and drop, "drop" event not firing in Firefox - Stack Overflow

Despite reading the Mozilla Developer Network docs carefully, and any answers I could find on Stack Ove

Despite reading the Mozilla Developer Network docs carefully, and any answers I could find on Stack Overflow, still I cannot get HTML5 drag and drop working in Firefox. I am using this in an AngularJS app. Everything works fine in Chrome and Internet Explorer, but not in Firefox (v33.1). I would rather not have to resort to using jQueryUI.

Hopefully someone can spot something here that I am missing. As you can see in the code below, I have added some console.log() calls to each event handler to check to make sure each event is firing as expected. In Firefox, all of the events fire except for the "drop" event.

Here is a simplified version of my code:

var assignEvents = function() {
  var rows = angular.element('.row');
  if (self.rows.length > 0) {
    // event handlers for rows
    angular.forEach(self.rows, function(row, key) {
      angular.element(row)
      // clear any existing bindings
      .off('dragstart')
      .off('dragenter')
      .off('dragover')
      .off('dragleave')
      .off('drop')
      .off('dragend')
      // add bindings
      .on('dragstart', handleDragStart)
      .on('dragenter', handleDragEnter)
      .on('dragover', handleDragOver)
      .on('dragleave', handleDragLeave)
      .on('drop', handleDrop)
      .on('dragend', handleDragEnd);
    });
  }
};

// event handlers

var handleDragStart = function(e) {
  console.log("dragStart");
  e.stopPropagation();
  this.style.opacity = 0.4;
  e.originalEvent.dataTransfer.setData('text/plain', this.id);
  e.originalEvent.dataTransfer.effectAllowed = 'link';
  e.originalEvent.dataTransfer.dropEffect = 'link';
};

var handleDragEnter = function(e) {
  e.preventDefault();
  e.stopPropagation();
  console.log("dragEnter");
  return false;
};

var handleDragOver = function(e) {
  e.preventDefault();
  e.stopPropagation();
  console.log("dragOver");
  return false;
};

var handleDragLeave = function(e) {
 e.preventDefault();
 e.stopPropagation();
 console.log("dragLeave");
 return false;
};

var handleDrop = function(e) {
  console.log("drop");
};

var handleDragEnd = function(e) {
  console.log("dragEnd");
  e.stopPropagation();
  e.preventDefault();
  this.style.opacity = 1;
};

assignEvents();

Despite reading the Mozilla Developer Network docs carefully, and any answers I could find on Stack Overflow, still I cannot get HTML5 drag and drop working in Firefox. I am using this in an AngularJS app. Everything works fine in Chrome and Internet Explorer, but not in Firefox (v33.1). I would rather not have to resort to using jQueryUI.

Hopefully someone can spot something here that I am missing. As you can see in the code below, I have added some console.log() calls to each event handler to check to make sure each event is firing as expected. In Firefox, all of the events fire except for the "drop" event.

Here is a simplified version of my code:

var assignEvents = function() {
  var rows = angular.element('.row');
  if (self.rows.length > 0) {
    // event handlers for rows
    angular.forEach(self.rows, function(row, key) {
      angular.element(row)
      // clear any existing bindings
      .off('dragstart')
      .off('dragenter')
      .off('dragover')
      .off('dragleave')
      .off('drop')
      .off('dragend')
      // add bindings
      .on('dragstart', handleDragStart)
      .on('dragenter', handleDragEnter)
      .on('dragover', handleDragOver)
      .on('dragleave', handleDragLeave)
      .on('drop', handleDrop)
      .on('dragend', handleDragEnd);
    });
  }
};

// event handlers

var handleDragStart = function(e) {
  console.log("dragStart");
  e.stopPropagation();
  this.style.opacity = 0.4;
  e.originalEvent.dataTransfer.setData('text/plain', this.id);
  e.originalEvent.dataTransfer.effectAllowed = 'link';
  e.originalEvent.dataTransfer.dropEffect = 'link';
};

var handleDragEnter = function(e) {
  e.preventDefault();
  e.stopPropagation();
  console.log("dragEnter");
  return false;
};

var handleDragOver = function(e) {
  e.preventDefault();
  e.stopPropagation();
  console.log("dragOver");
  return false;
};

var handleDragLeave = function(e) {
 e.preventDefault();
 e.stopPropagation();
 console.log("dragLeave");
 return false;
};

var handleDrop = function(e) {
  console.log("drop");
};

var handleDragEnd = function(e) {
  console.log("dragEnd");
  e.stopPropagation();
  e.preventDefault();
  this.style.opacity = 1;
};

assignEvents();
Share Improve this question asked Dec 2, 2014 at 2:19 Jeff FohlJeff Fohl 2,0763 gold badges24 silver badges26 bronze badges
Add a ment  | 

4 Answers 4

Reset to default 4

Well, it appears that the culprit was the setting of the effectAllowed and dropEffect in the handleDragStart() function. I am not sure why the setting of those disables the drop event in Firefox. Since I was using those primarily for their visual effect (in Chrome the cursor will change based on what effect is being used), in my case, removing those lines solved the problem for me.

EDIT: Actually, it appears that in Firefox, if you decide to set the the effectAllowed and dropEffect in the dragstart event handler, you need to also set the dropEffect in the dragenter and dragover event handlers. Failing to do so will prevent the drop event from firing.

for me it worked only after adding below code inside dragstart event handler e.dataTransfer.setData("text", "somedata");

you can also use for dragg and drop aculo script. it will provide you many features . I have applied in my website.

<div id="drag_demo_2" style="width:100px; height:100px; background:#fff85d; border:1px solid #333;"></div>
  <script type="text/javascript">
    new Draggable('drag_demo_2', { revert: true, snap: [40, 40] });
  </script>

Reference: http://madrobby.github.io/scriptaculous/draggable/

Unlike most other browsers, Firefox seems to require the e.dataTransfer.setData() method to be called in the dragstart event handler.

Run my code snippet, below, to see it in action.

  function dragStart(evt) {
      console.log("dragStart()");

      evt.dataTransfer.setData("text", "mydata"); // Needed by Firefox
  };
  //function dragEnter(evt) {
  //    evt.preventDefault();
  //};
  function dragOver(evt, isDestination) {
      console.log("dragOver()");

      if (isDestination) {
          evt.dataTransfer.dropEffect = "copy";
      }
      else {
          evt.dataTransfer.dropEffect = "move";
      }
      evt.preventDefault();
  };
  //function dragLeave(evt) {
  //    evt.preventDefault();
  //};
  function drop(evt) {
      console.log("drop()");

      var html = document.getElementById("sourceNode").innerHTML;
      document.getElementById("targetNode").innerHTML = html;

      evt.preventDefault();
  };
<div id="sourceNode"
             draggable="true" 
             ondragstart="dragStart(event)" 
             ondragover="dragOver(event, false)" 
             style="cursor:move"
         >drag this into box</div>

<div id="targetNode"
             ondragover="dragOver(event, true)" 
             ondrop="drop(event)" 
             style="width:100px;height:100px;border:1px dashed black;"
        >&nbsp;</div>

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745438261a4627709.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信