javascript - HTML5 拖放, "drop"事件未在 Firefox 中触发

标签 javascript angularjs html firefox

尽管仔细阅读了 Mozilla Developer Network 文档,并在 Stack Overflow 上找到了任何答案,但我仍然无法在 Firefox 中使用 HTML5 拖放操作。我在 AngularJS 应用程序中使用它。在 Chrome 和 Internet Explorer 中一切正常,但在 Firefox (v33.1) 中却不行。我宁愿不必诉诸于使用 jQueryUI。

希望有人能在这里发现我遗漏的东西。正如您在下面的代码中看到的那样,我向每个事件处理程序添加了一些 console.log() 调用以检查以确保每个事件都按预期触发。在 Firefox 中,除了“drop”事件之外的所有事件都会触发。

这是我的代码的简化版本:

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();

最佳答案

看来罪魁祸首是 handleDragStart() 函数中 effectAlloweddropEffect 的设置。我不确定为什么这些设置会禁用 Firefox 中的放置事件。因为我主要是为了它们的视觉效果而使用它们(在 Chrome 中,光标会根据使用的效果而改变),在我的例子中,删除这些线解决了我的问题。

编辑:实际上,在 Firefox 中,如果您决定在 dragstart 事件处理程序中设置 effectAlloweddropEffect,您还需要在 dragenterdragover 事件处理程序中设置 dropEffect。如果不这样做,将阻止触发 drop 事件。

关于javascript - HTML5 拖放, "drop"事件未在 Firefox 中触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27240829/

相关文章:

javascript - 使用背景附件 :fixed 时图像在 chrome 中移动

html - 可以滚动的CSS背景图片

javascript - iPhone Web App Div 标签在 Safari 中加载

javascript - 精通 jQuery 是否意味着精通 JavaScript?

javascript - 如何使用 JavaScript 并按值检查两列中的重复项?

javascript - 在 javascript 中的 map() 中动态设置 key ?

javascript - 如何访问指令中 ng-repeat 内的外部作用域

javascript - 将 ng-repeat-start 和 ng-repeat-end 与 2 个不同的对象一起使用

html - 如何在 PrimeNG 中单击后使焦点或边框消失

javascript - 如果一个 cookie 不存在,则在 Angular 中设置一个 cookie