是否可以使用JavaScript在Flash小程序之间进行拖放?
假设我想要一个包含Flash小程序的网页,并且想要将某些对象从网页的其余部分拖放到其他地方,这是否可能?
如果我们知道某个网站可以做到这一点,则可获赠!
解决方案
回答
如果整个站点是一个大的嵌入式Flash文件,则可以。
我认为我们无法通过其他任何方式来实现
回答
我要说的是,如果我们检测到该项目已拖到包含Flash内容的项目上,并且将拖动的对象设置为具有比Flash更高的Z索引,则可以放到Flash。然后,当它被丢弃时,我们可以使用javascript与Flash对话以告诉它被丢弃的位置和内容。
但是,相反的方法可能要困难得多,因为我们必须检测对象何时到达Flash电影的边框,然后将其"传递"给javascript处理程序(在html中创建,在flash中隐藏)。
问题可能是想知道这是否值得解决,或者我们是否可以在JS或者Flash中实现所有目标?
回答
除非要拖动到同一Flash应用程序中的目标,否则在Flash中是不可能的。
可以使用签名的Java小程序来完成(但是谁想走这条路呢?)
回答
继续,封装点是有效的,但是Flash可以执行JS函数,而Seldaek正确的是,具有较高z-index的HTML元素应该浮在Flash电影上。因此,如果我们在JS中完成了所有拖动处理,并让Flash读取了自己的尺寸和指针在应用中的位置,则它可能会向JS方法发出信号,甚至(尤其是)当指针离开指针时,从属元素也将指向指针。 Flash应用程序的边界。不过,这将是多毛的。
回答
免责声明我根本没有测试过此代码,但是这个想法应该可行。此外,这仅处理拖动到Flash电影的操作。
这是一些使用外部接口类的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在找出答案时发布了一些代码,但是这一代码已经过测试。我有一个非常简单的工作示例,可让我们在Flash中来回拖动。我午休时把它们放在一起很乱。
这是演示
和源
基类直接从外部接口LiveDocs获取。我添加了MyButton,以便按钮可以包含一些文本。大多数javascript都来自相同的LiveDocs示例。
我使用mxmlc进行了编译。