Возможно ли перетаскивание из / за пределы Flash-апплета с помощью JavaScript?

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
6
0
2 935
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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

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

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

Вопрос, вероятно, в том, стоит ли это того, или можно ли добиться всего с помощью JS или Flash?

Итак, я думаю, ответ таков: это возможно, но нет известного API или другого средства, чтобы сделать это стандартным способом.

BoD 17.09.2008 19:42

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

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

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

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

Вот код ActionScript 3.0, в котором используется класс Внешний интерфейс.

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>
Ответ принят как подходящий

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

Вот демонстрация

И источник

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

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

Другие вопросы по теме