在 Internet Explorer 9 中进行 Dart HTML5 拖放

Posted

技术标签:

【中文标题】在 Internet Explorer 9 中进行 Dart HTML5 拖放【英文标题】:Dart HTML5 Drag and Drop in Internet Explorer 9 【发布时间】:2013-05-18 01:57:52 【问题描述】:

我正在尝试使用 Dart 实现 HTML5 拖放。为了让拖放在 IE9 中使用链接和图像以外的元素工作,我使用了一种解决方法(参见 Internet Explorer 9 Drag and Drop (DnD) 和 this live example)。

我在 Dart 中使用如下代码:

/**
 * Workaround to enable drag-and-drop elements other than links and images in
 * Internet Explorer 9.
 */
void _enableIE9drag(Element element)      
  element.onSelectStart.listen((MouseEvent event) 
    // Prevent selection of text.
    event.preventDefault();

    // This should be a native call to dragDrop()
    element.dragDrop();
  );

element.dragDrop() 的调用应该是IE9 的原生javascript 调用。而dart2js 将方法调用编译为dragDrop$0()

如果我手动编辑生成的 js 输出并删除 $0,一切都会在 IE9 中正常运行。

那么,如何调用IE9原生的dragDrop()javascript函数呢?


编辑

按照 Greg 的建议,我打开了 bug 10837,希望我们可以摆脱与 dart:html 的浏览器不一致问题。

【问题讨论】:

【参考方案1】:

dragDrop() 不是 Dart Element 类中的方法,因此您不能调用它。

您是否尝试过使用Element 类中定义的拖放事件? Dart 提供了 shims 以使这些在 IE9 中工作。

如果您无法使用 Dart 的拖放 api 跨浏览器工作,那么您应该提交一个错误。

【讨论】:

Element 的拖放事件在 IE9 中确实有效,但仅适用于 imagelink 标签。调用dragDrop() 的解决方法可以拖动其他元素,例如 divs 啊-对,我以为您正在尝试进行文件拖放。为了拖动 div,我只处理鼠标事件,并使用 css transform translate。原生拖放 api 在浏览器中的行为不同。【参考方案2】:

通过在我的主要 HTML 文件管理器中添加一些 javascript 找到了解决方案(如果您有更好的想法,请告诉我):

<html>
  <head>
    <!-- some stuff -->
    <script type="text/javascript">
      function callDragDrop(el) 
        el.dragDrop();
      
    </script>
  </head>
  <body>
  <!-- some stuff -->
  </body>
 </html>

现在我可以用 Darts js-interop 调用这个函数了:

/**
 * Workaround to enable drag-and-drop elements other than links and images in
 * Internet Explorer 9.
 */
void _enableIE9drag(Element element) 
  if (element.draggable == null) 
    // HTML5 draggable support is not available --> try to use workaround.

    element.onSelectStart.listen((MouseEvent event) 
      // Prevent selection of text.
      event.preventDefault();

      // Use the javascript function to call the native dragDrop() of element
      js.context.callDragDrop(element);
    );
  

编辑

创建了一个帮助库以在 Dart 中使用 HTML5 Drag and Drop。

【讨论】:

不幸的是,JS 互操作包给生成的 js 代码增加了很多开销——所以要小心使用。理想情况下,Dart 应该能够在 dart:html 中解决这些类型的跨浏览器不一致。我建议提交一个错误。 dartbug.com @Greg:你是对的。这里是Issue 10837 FWIW - 我用 javascript 编写了一些不同的拖放交互。 IE。将 DOM 元素移动到目标。我最初使用本机 dnd,但发现与叠加图像的绘制方式不一致(以及其他我忘记的事情)。最后,我只使用 DOM 和鼠标事件重写了它。这是我获得所需精确控制的唯一方法。我认为这就是圆圈拖放在 g+ 中的工作方式。 几乎放弃了尝试实现跨浏览器拖动图像...但后来找到了一个可以使用 SVG 图像的解决方案。我在上面的答案中包含了一个指向我创建的 Dart 库的链接,以使使用 HTML5 拖放更加舒适。 @Greg:现在HTML5 Drag and Drop 库中支持触摸事件。

以上是关于在 Internet Explorer 9 中进行 Dart HTML5 拖放的主要内容,如果未能解决你的问题,请参考以下文章

在 Internet Explorer 9 中更改域名后,Ajax 停止工作

Internet Explorer 9 - 按比例调整图像大小

为啥我的表单不能在 Internet Explorer 9 中上传文件?

在 Internet Explorer 9+ 中使用 IUIAutomation 自动另存为文件

Internet Explorer <= 9 中的 AngularJS $http.post 错误

Internet Explorer 9 无法正确呈现表格单元格