0

我正在尝试使用 Dart 实现 HTML5 拖放。为了让拖放在IE9 中与链接和图像以外的元素一起工作,我使用了一种解决方法(请参阅Internet Explorer 9 拖放 (DnD)这个实时示例)。

我在 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 中正常运行。

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


编辑

正如 Greg 所建议的那样,我已经打开了bug 10837,希望我们可以摆脱这种浏览器不一致的问题dart:html

4

2 回答 2

0

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

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

如果你不能使用 Dart 的拖放 api 让它跨浏览器工作,那么你应该提交一个错误。

于 2013-05-22T21:49:30.043 回答
0

通过向我的主要 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 拖放。

于 2013-05-23T11:23:07.680 回答