2013-06-03 9 views
7

のための機能検出を行う方法はありますか?HTML5ドラッグアンドドロップ(JavaScriptまたはダーツ)のsetDragImageHTML5ドラッグアンドドロップのsetDragImageのフィーチャー検出

は私が持つ一般的なHTML5のドラッグ&ドロップ機能の検出を行う( guide to detecting everythingから)次

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

これは、などのクロム、Firefoxの、およびIE10のためtrueを返します。 IE9にはfalseが返されます。

さて、問題はIE10である:それはHTML5のドラッグ&ドロップのほとんどをサポートしていますが、setDragImageをサポートし、私はちょうどsetDragImage用ポリフィルを提供する必要がされていません。しかし、私はどのようにこれを検出する方法を把握することができませんでした。

+1

対象外あなたのpolyPillはsetDragImageのために何をしていますか? – Woody

+1

@Woody絶対配置でHTML要素を手動で作成し、それをマウスで動かします。これを実際に見るには、[このページ](http://edu.makery.ch/projects/dart-html5-drag-and-drop/)の「カスタムドラッグイメージ」の例を参照してください。コードは[here](https://)と呼ばれる[ここ](https://github.com/marcojakob/dart-html5-dnd/blob/master/lib/src/dnd/draggable.dart#L484)です。 github.com/marcojakob/dart-html5-dnd/blob/master/lib/src/dnd/draggable_emulated.dart#L147) –

+0

ビットオフポイントは、setDragImaageの実装が必要な場合のpolyfillです:http:// stackoverflow.com/a/20585673/178550 – Phil

答えて

2

以前の回答で述べた機能の検出は、Opera 12では失敗しました。setDragImageのサポートが主張されているだけなので、機能しません。リンクされているDartライブラリもOpera 12で完全に失敗し、コンソールに複数のエラーが発生します。

ゴーストイメージをポリフィルすることは実際には不可能です。ドキュメント要素を作成して適切な場所に配置しても、setDragImageを使わずにデフォルト要素を取り除くことはできません。

私が知っている唯一の解決策は、Opera 12とすべてのバージョンのIE(IE11を含む)をフィルタリングして、従来のマウスイベントスクリプトを使用してレガシーブラウザとして扱うことです。ダイレクト機能のテストが失敗したので、私は(すなわち、それらの特定のブラウザを検出するために、オブジェクトのテストを使用)間接オブジェクトのテストをお勧めします:

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

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

ダーツ[html5_dnd] (http://pub.dartlang.org/packages/html5_dnd)私は、悪意のあるブラウザの検出: 'window.navigator.appName == 'Microsoft Internet Explorer'を使って切り替えました。この例は、IE9とIE10で動作するはずです。私はIE11については知らない。そしてオペラは問題かもしれない、はい。 –

+0

if(document.uniqueID)でIEを検出することもできますが、これはユーザーが変更できません。 Operaをフィルタリングしてエラーを投げないようにしてもいいですか? Opera 12は引き続き主要なバージョンです(通常のユーザーはWebkitビルドにアップグレードしていません。十分ではないため) – brothercake

+0

ありがとうございます。私は[問題](https://github.com/marcojakob/dart-html5-dnd/issues/15)を提出しました。 –

7

この解決策は、一般的なD & Dサポートが既にチェックされていることを前提としています。

のJavaScript(IE、Firefoxの、オペラと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"); 
    } 
} 

ダート:

私は "ネイティブ" ダーツのコードでこれを行う方法を見つけられませんでしたので、js-interopがあります行く道。

+0

うわー、完璧に動作します。ダーツについてのヒントもありがとうございます。誰かがダーツでこれを行う方法についての方法を見つけたら、教えてください! –

+1

BTW - このスニペットを使用する[HTML5ドラッグアンドドロップ](http://edu.makery.ch/projects/dart-html5-drag-and-drop/)用のDartライブラリを作成しました。 –

+0

@MarcoJakob Nice library!あなたはいつかパブでそれを公開するつもりですか? :) – MarioP

3

あなたはsetDragImageによって-IEポリフィルを使用することができます

これは、それが実際に(READMEから)どのように動作するかです:

私はあなたがに変更を加える場合には気づいdragstartイベント内の クラスの外観を変更して をすぐに削除すると、 は変更された要素のビットマップコピーとなり、ドラッグするために使用されます。 したがって、このライブラリが実際に実行するのは、 にドラッグして表示したい画像が含まれるクラスを追加してから、 を削除することによってターゲットの要素スタイルを変更するsetDragImage メソッドを実装することです。このようにして、ブラウザは一時的なスタイル をドラッグイメージとして表示します。

+0

ニース、ありがとう。私は実際に[Dart HTML5 dnd](https://github.com/marcojakob/dart-html5-dnd)で同様のことをしていました。しかし、あまりにも多くのそのような "ハッキング"のために、私は最終的に[HTML5なしのdnd](http://code.makery.ch/blog/drag-and-drop-without-html5/)を行うことに決めました。 –

関連する問題