【问题标题】:Feature Detection for setDragImage of HTML5 Drag and DropHTML5拖放的setDragImage的特征检测
【发布时间】:2013-06-03 09:52:11
【问题描述】:

有没有办法对 HTML5 拖放(在 JavaScript 或 Dart 中)的 setDragImage 进行特征检测?

我使用以下(来自guide to detecting everything)进行一般的 HTML5 拖放功能检测:

return 'draggable' in document.createElement('span');

对于 Chrome、Firefox 等和 ​​IE10,这将返回 true。对于 IE9,它将返回 false

现在,问题在于 IE10:虽然它支持大部分 HTML5 拖放,但不支持 setDragImage,我需要为 setDragImage 提供一个 polyfill。但我不知道如何检测到这一点。

【问题讨论】:

  • 出于兴趣,你的 setDragImage 的 polyfill 做了什么??
  • @Woody 它手动创建一个具有绝对定位的 HTML 元素并用鼠标移动它。要查看它的实际效果,请参阅 this page 上的 custom drag images 示例和 IE10。代码是here,称为here
  • 有点离题,这里有一个 polyfill,以防你需要实现 setDragImaage:*.com/a/20585673/178550

标签: javascript html dart


【解决方案1】:

此解决方案假定已检查一般 D&D 支持。

JavaScript(在 IE、Firefox、Opera 和 Chrome 中测试):

function test() {
    var testVar = window.DataTransfer || window.Clipboard;  // Clipboard is for Chrome
    if("setDragImage" in testVar.prototype) {
        window.alert("supported");
    } else {
        window.alert("not supported");
    }
}

飞镖:

我没有找到使用“本机” Dart 代码的方法,所以js-interop 是要走的路。

【讨论】:

  • 哇,完美运行。也感谢您对 Dart 的提示。如果有人找到如何在 dart 中执行此操作的方法,请告诉我!
  • 顺便说一句 - 我为 HTML5 Drag and Drop 创建了一个 Dart 库,我在其中使用了这个 sn-p。
  • @MarcoJakob 不错的图书馆!你打算哪天在 Pub 上发布它? :)
  • 它已经在那里了:Pub html5_dnd(不知怎么在 pub 上搜索似乎找不到它...)
【解决方案2】:

您可以使用 setDragImage-IE polyfill:

https://github.com/MihaiValentin/setDragImage-IE

这就是它的实际工作方式(来自自述文件):

我注意到,如果您更改元素的样式(添加 更改外观的类)在dragstart 事件中,然后 立即在setTimeout 中删除它,Internet Explorer 将使 修改元素的位图副本,并将其用于拖动。 所以,这个库实际上做的是实现setDragImage 通过添加一个类来改变目标元素样式的方法 包括您希望在拖动时出现的图像,然后 删除它。这样,浏览器显示的临时样式 元素作为拖动图像。

【讨论】:

  • 很好,谢谢。我实际上在Dart HTML5 dnd 中做过类似的事情。但是因为太多这样的“hack”,我最终决定做dnd without HTML5
【解决方案3】:

上一个答案中提到的特征检测在 Opera 12 中失败——因为它声称支持 setDragImage,它只是不起作用。已链接到的 Dart 库在 Opera 12 中也完全失败,向控制台抛出多个错误。

实际上不可能填充一个幻影图像——即使你创建了一个文档元素并将其放置在正确的位置,如果没有 setDragImage,你也无法摆脱默认元素。

我知道的唯一解决方案是过滤掉 Opera 12 和所有版本的 IE(直到并包括 IE11),并将它们视为传统浏览器,必须使用传统的鼠标事件脚本来处理它们。由于直接功能测试失败,我建议进行间接对象测试(即使用对象测试来检测那些特定的浏览器):

var hasNativeDraggable = (element.draggable && !(document.uniqueID || window.opera));

【讨论】:

  • 在飞镖html5_dnd 中,我切换到使用(邪恶)浏览器检测:window.navigator.appName == 'Microsoft Internet Explorer'。该示例应适用于 IE9 和 IE10。我不知道IE11。是的,Opera 可能是个问题。
  • 你也可以用 if(document.uniqueID) 来检测 IE,这个是用户无法更改的。至少过滤 Opera 可能会很好,这样它就不会抛出错误。 Opera 12 仍然是主导版本(普通用户不会升级到 webkit 版本,因为它们不够好)
  • 谢谢。我为此提交了issue
  • btw -- 拖动行为在 IE11 中有效,但自定义重影图像不起作用,它只显示默认值。您是如何在 IE10 中完成这项工作的——您是如何隐藏默认重影以阻止其显示以及自定义图像?因为我不知道这是可能的,所以我假设您希望从本机支持中过滤所有版本的 IE;但是如果您保留 IE 并且只过滤 Opera 12,那么您将不需要 document.uniqueID 测试: var hasNativeDraggable = (element.draggable && !window.opera); //所有支持的浏览器除了opera
  • 无法在 IE10 中隐藏拖动图像(就像您在回答中所说的那样)。我只是模拟 IE10 中的拖动,并且在使用自定义拖动图像时不使用 HTML5 可拖动。我很高兴你没有看到太大的不同:-)。在 IE10 中查看拖动光标时可以识别它。光标由 CSS 设置,而不是 HTML5 可拖动光标。
最近更新 更多