Можно ли перетаскивать объекты из / в Flash-апплета с помощью JavaScript? - PullRequest
6 голосов
/ 17 сентября 2008

Допустим, мне нужна веб-страница, содержащая апплет Flash, и я хотел бы перетаскивать некоторые объекты с или на остальную часть веб-страницы, это вообще возможно?

Бонус, если вы знаете сайт, который делает это!

Ответы [ 6 ]

12 голосов
/ 17 сентября 2008

Этот заинтриговал меня. Я знаю, что jessegavin опубликовал какой-то код, пока я решил это выяснить, но этот тестируется. У меня есть очень простой рабочий пример, который позволяет перетаскивать данные с флэш-памяти. Это довольно грязно, когда я бросил это вместе во время обеденного перерыва.

Вот демоверсия

И источник

Базовый класс взят непосредственно из внешнего интерфейса LiveDocs . Я добавил MyButton, чтобы кнопка могла содержать текст. Большая часть javascript взята из того же примера LiveDocs.

Я скомпилировал это с помощью mxmlc.

3 голосов
/ 17 сентября 2008

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ Я вообще не тестировал этот код, но идея должна работать. Кроме того, это обрабатывает только перетаскивание в флэш-фильма.

Вот некоторый код Actionscript 3.0, который использует ExternalInterface class.

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);
}

Вот код HTML / jQuery

<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>
1 голос
/ 17 сентября 2008

Подождите, точка инкапсуляции является допустимой, но flash может выполнять функции JS, и Seldaek прав, что HTML-элемент с более высоким z-индексом должен плавать во флэш-ролике. Так что, если вы выполнили всю обработку перетаскивания в JS, и флэш-память считала свои собственные измерения и положение указателя в приложении, это могло бы сигнализировать методам JS, которые подчиняют элемент (ы) указателю, даже (особенно), когда указатель покидает Границы флеш-приложения. Хотя это было бы довольно волосато.

1 голос
/ 17 сентября 2008

Я бы сказал, что можно сбросить до Flash, если вы обнаружите, что элемент перетаскивается на объект, содержащий флэш-содержимое, и вы установили для перетаскиваемых объектов z-индекс выше Вспышка. Затем, когда он отброшен, вы можете поговорить с Flash, используя javascript, чтобы сообщить, где и что было отброшено.

Однако, наоборот, возможно, гораздо сложнее, потому что вам нужно определить, когда объект достигает границы флэш-фильма, и «передать» его обработчику javascript (создать его в html, спрятать во flash ).

Вопрос, вероятно, состоит в том, чтобы знать, стоит ли эта проблема, или, может быть, вы можете достичь всего в JS или во Flash?

0 голосов
/ 17 сентября 2008

Невозможно во флэш-памяти - если вы не хотите перетащить на цель внутри того же приложения флэш-памяти.

Возможно, это можно сделать с помощью подписанного Java-апплета (но кто хочет пойти по этому пути?)

0 голосов
/ 17 сентября 2008

Если весь сайт представляет собой один большой встроенный флэш-файл, то да, это возможно.

Я не думаю, что вы можете достичь этого другим способом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...