6 Stimmen

Ist es möglich, mit JavaScript von/nach außerhalb eines Flash-Applets zu ziehen und abzulegen?

Angenommen, ich möchte eine Webseite, die ein Flash-Applet enthält, und ich möchte einige Objekte per Drag & Drop von oder auf den Rest der Webseite ziehen, ist das überhaupt möglich?

Wenn Sie eine Website kennen, die das tut, haben Sie einen Bonus!

12voto

enobrev Punkte 21804

Das hier hat mich neugierig gemacht. Ich weiß, jessegavin gepostet einige Code, während ich ging, um dies herauszufinden, aber diese ist getestet. Ich habe ein super-einfaches Arbeitsbeispiel, das Sie zu und von Flash ziehen können. Es ist ziemlich chaotisch, wie ich warf es zusammen während meiner Mittagspause.

Hier ist die Demo

Und die Quelle

Die Basisklasse wird direkt aus der Externe Schnittstelle LiveDocs . Ich fügte MyButton hinzu, damit die Schaltfläche einen Text enthalten kann. Der Großteil des Javascript stammt aus dem gleichen LiveDocs Beispiel.

Ich habe dies mit mxmlc kompiliert.

3voto

jessegavin Punkte 70339

HAFTUNGSAUSSCHLUSS Ich habe diesen Code noch nicht getestet, aber die Idee sollte funktionieren. Außerdem behandelt dies nur das Ziehen zu einen Flash-Film.

Hier ist etwas Actionscript 3.0-Code, der die ExterneSchnittstelle Klasse.

import flash.display.Sprite;
import flash.external.ExternalInterface;
import flash.net.URLLoader;
import flash.net.URLRequest;

if (ExternalInterface.available) {
  ExternalInterface.addCallback("handleDroppedImage", myDroppedImageHandler);
}

private function myDroppedImageHandler(url:String, x:Number, y:Number):void {

  var container:Sprite = new Sprite();
  container.x = x;
  container.y = y;
  addChild(container);

  var loader:Loader = new Loader();
  var request:URLRequest = new URLRequest(url);
  loader.load(request);

  container.addChild(loader);
}

Hier ist der HTML/jQuery-Code

<html>
<head>
  <title>XHTML 1.0 Transitional Template</title>
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.5.2/jquery-ui.min.js"></script>
  <script type="text/javascript">
    $(function() {
      $("#dragIcon").draggable();

      $("#flash").droppable({ 
        tolerance : "intersect",
        drop: function(e,ui) {

          // Get the X,Y coords relative to to the flash movie
          var x = $(this).offset().left - ui.draggable.offset().left;
          var y = $(this).offset().top - ui.draggable.offset().top;

          // Get the url of the dragged image
          var url = ui.draggable.attr("src");

          // Get access to the swf
          var swf = ($.browser.msie) ? document["MyFlashMovie"] : window["MyFlashMovie"];

          // Call the ExternalInterface function
          swf.handleDroppedImage(url, x, y);

           // remove the swf from the javascript DOM
          ui.draggable.remove();
        }
      });
    });
  </script>
</head>
<body>

  <img id="dragIcon" width="16" height="16" alt="drag me" />

  <div id="flash">
    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
      id="MyFlashMovie" width="500" height="375"
      codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
      <param name="movie" value="MyFlashMovie.swf" />
      <param name="quality" value="high" />
      <param name="bgcolor" value="#869ca7" />
      <param name="allowScriptAccess" value="sameDomain" />
      <embed src="MyFlashMovie.swf" quality="high" bgcolor="#869ca7"
        width="500" height="375" name="MyFlashMovie" align="middle"
        play="true" loop="false" quality="high" allowScriptAccess="sameDomain"
        type="application/x-shockwave-flash"
        pluginspage="http://www.macromedia.com/go/getflashplayer">
      </embed>
    </object>
  </div>

</body>
</html>

1voto

Seldaek Punkte 39199

Ich würde sagen, es ist möglich, die zu Flash, wenn Sie erkennen, dass das Element auf die, die das Flash-Zeug enthält gezogen wird, und Sie setzen Sie Ihre gezogenen Objekte zu einem z-Index höher als die Flash haben. Dann, wenn es fallen gelassen wird, können Sie mit Flash mit Javascript sprechen, um ihm zu sagen, wo und was fallen gelassen wurde.

Der umgekehrte Weg ist jedoch wahrscheinlich viel schwieriger, da man erkennen muss, wann das Objekt den Rand des Flash-Films berührt, und es an den Javascript-Handler "weitergeben" muss (in der Html-Datei erstellen, in Flash ausblenden).

Die Frage ist wahrscheinlich, ob es die Mühe wert ist, oder ob man vielleicht alles in JS oder in Flash erreichen kann?

1voto

Warten Sie, die Kapselung Punkt ist eine gültige ein, aber Flash kann JS-Funktionen ausführen, und Seldaek ist richtig, dass ein HTML-Element mit einem höheren z-Index auf dem Flash-Film schweben sollte. Wenn man also das gesamte Drag-Handling in JS durchführt und Flash seine eigenen Dimensionen und die Position des Zeigers in der App lesen lässt, könnte man JS-Methoden signalisieren, die dem Zeiger Elemente unterordnen, auch (oder gerade) wenn der Zeiger die Grenzen der Flash-App verlässt. Es wäre allerdings ziemlich haarig.

0voto

Cetra Punkte 2565

Wenn die gesamte Website eine große eingebettete Flash-Datei ist, ist das möglich.

Ich glaube nicht, dass man es anders erreichen kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X