2013-06-03 2 views
7

Gibt es eine Möglichkeit, Feature-Erkennung für setDragImage von HTML5 Drag & Drop (in JavaScript oder Dart)?Feature-Erkennung für setDragImage von HTML5 Drag & Drop

ich tun, um die allgemeine HTML5 Drag & Drop-Feature-Erkennung mit den folgenden (aus guide to detecting everything):

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

Diese true für Chrome, Firefox etc. zurück, und IE10. Es wird false für IE9 zurückgegeben.

Nun ist das Problem mit IE10: Während es den meisten von HTML5 Drag & Drop unterstützt, wird setDragImage nicht unterstützt und ich brauche eine polyfill bietet nur für setDragImage. Aber ich konnte keinen Weg finden, dies zu erkennen.

+1

aus interesse was macht ihr polyfill für setDragImage ?? – Woody

+1

@Woody Erzeugt manuell ein HTML-Element mit absoluter Positionierung und bewegt es mit der Maus herum. Um es in Aktion zu sehen, siehe das Beispiel 'custom drag images' auf [diese Seite] (http://edu.makery.ch/projects/dart-html5-drag-and-drop/) mit IE10. Der Code ist [hier] (https://github.com/marcojakob/dart-html5-dnd/blob/master/lib/src/dnd/draggable.dart#L484), der [hier] heißt (https: // github.com/marcojakob/dart-html5-dnd/blob/master/lib/src/dnd/draggable_emulate.dart#L147) –

+0

Ein bisschen off Punkt, hier ist ein Polyfill, falls Sie die Implementierung von setDragImaage benötigen: http: // stackoverflow.com/a/20585673/178550 – Phil

Antwort

2

Die Feature-Erkennung, die in der vorherigen Antwort erwähnt wird, schlägt in Opera 12 fehl - weil es die Unterstützung für setDragImage beansprucht, funktioniert es einfach nicht. Die Dart-Bibliotheken, mit denen verknüpft wurde, scheitern auch vollständig in Opera 12 und werfen mehrere Fehler auf die Konsole.

Es ist eigentlich nicht möglich, ein Geisterbild zu füllen - selbst wenn Sie ein Dokumentelement erstellen und es an der richtigen Stelle positionieren, können Sie das Standardelement ohne setDragImage nicht entfernen. Die einzige Lösung, die ich kenne, besteht darin, Opera 12 und alle Versionen von IE (bis einschließlich IE11) herauszufiltern und sie als Legacy-Browser zu behandeln, die mit herkömmlichen Mausereignisskripten behandelt werden müssen. Da der direkte Funktion Test nicht besteht, würde ich einen indirektes Objekt Test empfehlen (dh ein Objekt Test verwenden, um diese speziellen Browser zu erkennen):

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

Im Dart [html5_dnd] (http://pub.dartlang.org/packages/html5_dnd) Ich wechselte zu einer (bösen) Browser-Erkennung: 'window.navigator.appName == 'Microsoft Internet Explorer'. Das Beispiel sollte in IE9 und IE10 funktionieren. Ich weiß nichts über IE11. Und Opera könnte ein Problem sein, ja. –

+0

Sie können IE auch mit if (document.uniqueID) erkennen, das vom Benutzer nicht geändert werden kann. Könnte nett sein, Opera zumindest zu filtern, damit es keine Fehler wirft. Opera 12 ist immer noch die dominante Version (normale Benutzer aktualisieren nicht auf die Webkit-Builds, weil sie nicht gut genug sind) – brothercake

+0

Danke. Ich habe dafür ein [Problem] (https://github.com/marcojakob/dart-html5-dnd/issues/15) eingereicht. –

7

Diese Lösung geht davon aus, dass D & D-Unterstützung bereits überprüft wurde.

JavaScript (getestet in IE, Firefox, Opera und 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:

ich keine Möglichkeit, dies zu tun mit "native" Dart-Code gefunden haben, so js-interop ist der Weg, den man gehen sollte.

+0

Wow, funktioniert perfekt. Danke auch für den Hinweis auf Dart. Wenn jemand einen Weg findet, wie man das im Dart macht, lass es mich wissen! –

+1

BTW - Ich habe eine Dart-Bibliothek für [HTML5 Drag and Drop] (http://edu.makery.ch/projects/dart-html5-drag-and-drop/) erstellt, wo ich dieses Snippet verwende. –

+0

@MarcoJakob Schöne Bibliothek! Haben Sie vor, es eines Tages in Pub zu veröffentlichen? :) – MarioP

3

Sie den polyfill SetDragImage-IE verwenden:

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

Dies ist, wie es (aus der Readme) tatsächlich funktioniert:

ich bemerkt, dass, wenn Sie eine Änderung an der machen Element-Stil (Hinzufügen einer Klasse, die Aussehen ändert) innerhalb der dragstart Ereignis und dann Entfernung sofort in einem setTimeout, wird Internet Explorer eine Bitmap-Kopie des geänderten Elements und wird es zum Ziehen verwenden. Also, was diese Bibliothek tatsächlich tut, ist die Implementierung der setDragImage Methode, die den Element-Stil des Ziels durch Hinzufügen einer Klasse ändert, die enthält das Bild, das beim Ziehen angezeigt werden soll, und dann entfernt es.Auf diese Weise zeigt der Browser den temporären Stil das Element als das Drag-Image an.

+0

Schön, danke. Ich hatte tatsächlich etwas ähnliches in [Dart HTML5 dnd] getan (https://github.com/marcojakob/dart-html5-dnd). Aber wegen zu vieler solcher "Hacks" habe ich mich schließlich dazu entschieden [dnd ohne HTML5] (http://code.makery.ch/blog/drag-and-drop-without-html5/). –