想知道是否可以在不使用SWFobject或任何其他额外的javascript文件的情况下从javascript到flash进行通信.
目前我正在使用以下指南:http: //www.viget.com/inspire/bi-directional-actionscript-javascript-communication
感谢您的时间.
我有一个小测试swf来测试从JavaScript调用ActionScript(3.0)函数.我使用Flash文档作为参考:(http://www.adobe.ca/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000340.html)页面加载我出现Flash Player错误:
SecurityError: Error #2060: Security sandbox violation: ExternalInterface caller file: c:/externalinterface.swf cannot access file: c:\myhtml.html
at flash.external::ExternalInterface$/_initJS()
at flash.external::ExternalInterface$/addCallback()
at externalinterface_fla::MainTimeline/frame1()
Run Code Online (Sandbox Code Playgroud)
这是ActionScript:
import flash.external.ExternalInterface
function callMe(name:String):String{
return "busy signal";
}
ExternalInterface.addCallback("myFunction",callMe);
Run Code Online (Sandbox Code Playgroud)
和JS:
<script type="text/javascript" language="javascript">
function callSwf() {
var callResult = flashObject.myFunction("Nick");
alert(callResult);
}
</script>
Run Code Online (Sandbox Code Playgroud)
最后HTML对象:
<object width="550" height="400">
<param name="movie" value="externalinterface.swf">
<embed src="externalinterface.swf" width="550" height="400">
</embed>
</object>
Run Code Online (Sandbox Code Playgroud)
我们如何解决这个问题?
据Adobe称,嵌入Flash对象的"现代"更新方式:
<object id="theFlash" name="theFlash" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
width="400" height="225" align="middle">
<param name="movie" value="theflashfile.swf" />
<param name="allowScriptAccess" value="always" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash"
data="getStreamFrame.swf" width="400" height="225">
<param name="allowScriptAccess" value="always" />
<!--<![endif]-->
<a href="http://www.adobe.com/go/getflash">
<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
</a>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>
Run Code Online (Sandbox Code Playgroud)
尝试在SWF中调用AS3函数时,从Javascript:
var flashObj = document.getElementById('theFlash');
flashObj.someASFunction();
Run Code Online (Sandbox Code Playgroud)
(在AS方面:)
import flash.external.*;
function someASFunction() {
//show some text
}
ExternalInterface.addCallback("someASFunction", someASFunction);
Run Code Online (Sandbox Code Playgroud)
这不会在Firefox和Chrome的工作.闪光灯工作和加载.flashObj确实获得了对象的引用,但someASFunction未定义且不会被调用.
如果我用embed标签替换object标签:
<embed id="theFlash" name="theFlash" height="225" width="400" align="middle"
type="application/x-shockwave-flash" allowscriptaccess="always"
src="theflashfile.swf" />
Run Code Online (Sandbox Code Playgroud)
然后它适用于Firefox和Chrome(AS函数被调用并正常工作) - (虽然它在IE中不起作用). …
我们有一个Flash应用程序(AS3).这是一个在我们自己的投影仪中运行的桌面应用程序.没有空气.投影机是用C++编写的.投影机通过ExternalInterface为Flash部件提供对Windows API的间接访问.
现在我们想让我们的社区创建插件.只是让他们用一些动作脚本3制作一个小动画.
插件将在运行时作为外部.swf文件加载.当然,我们希望我们的用户在网上分发插件.
但是,我们有安全问题.如果某个坏人会利用间接访问Win API怎么办?
我做了一个小测试.加载到程序中的子.swf尝试调用ExternalInterface方法.事实证明,child.swf能够做到这一点.因此,加载到我们程序中的每个.swf文件都将自动访问Win API.
下载我们程序的插件变得和.exe文件一样危险.
我们可以禁止对加载的.swf进行ExternalInterface访问吗?如果不是 - 在安全性考虑的情况下,如何在AS3中实现插件系统?
我很感激任何有用的提示.
我创建了一个非常简单的SWF来演示:
package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.external.ExternalInterface;
public class FlashIELeak extends MovieClip {
public function FlashIELeak() {
addEventListener(Event.ENTER_FRAME, onFrame);
}
private function onFrame(e:Event):void {
ExternalInterface.call("test", null);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在Chrome中加载,没有问题.记忆保持或多或少固定.
在IE和内存中的负载只是持续上升 - 大约30k/s.您甚至不需要声明测试功能.只是将swf嵌入页面中,你就会泄漏.在我们的项目中,我们传递了一个具有多个属性的对象,IE正在以120k/s的速度泄漏.不好.
有人见过这个吗?我无法找到与此相关的任何其他帖子.
我试图从javascript访问swf,所以我在tryocs中的这个例子是我想要修改的.http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/external/ExternalInterface.html#includeExamplesSummary
但是,由于某种原因,它无法正常工作.我遇到的问题是它在Safari和Firefox中不起作用,只有在javascript将值传递给swf之前在函数中放置警报时它才有效.(似乎需要一些时间)我也尝试在as3中设置一个计时器,但是计时器不起作用,只有js中的警报才有帮助.
我想做的就是使用js告诉swf文件播放ep1.swf.这是我的js代码:
document.observe('dom:loaded', function() {
$('episode1').observe('click', function() {
var params = {wmode : "transparent", allowScriptAccess:"always", movie:"header"};
swfobject.embedSWF("swf/float.swf", "header", "100%", "100%", "9.0.0","expressInstall.swf", "", params, "");
sendToActionScript("ep1.swf");
});
})
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName];
} else {
//alert("aaa")
return document[movieName];
}
}
function sendToActionScript(value) {
thisMovie('header').sendToActionScript(value);
}
Run Code Online (Sandbox Code Playgroud)
这是我的as3代码:
private function receivedFromJavaScript(value:String):void {
loader.load(new URLRequest(value));
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了很长时间,有谁知道如何解决这个问题?谢谢.
鉴于我的网页上有一个名为myVar的全局javascript变量,如何使用javascript从我的flash影片中访问变量myVar的值?
我看到很多使用外部接口的例子,以便从actionscript执行javascript,但是我无法找到使用actionscript将值返回到flash影片的示例.
提前致谢.我希望我的问题很清楚.
我正在尝试编辑一些flash以进行外部javascript函数调用,但没有成功.这是我的actionscript 2.0代码:
//testing external .js calls
import flash.external.ExternalInterface;
//attempting to make external js call
ExternalInterface.call("createPlaylist","It's my Life!");
Run Code Online (Sandbox Code Playgroud)
这是我的javascript;
function createPlaylist(mess){
alert("called createPlaylist: " + mess);
}
Run Code Online (Sandbox Code Playgroud)
我见过很多例子,我对使用它感到困惑 ExternalInterface.addCallback.我不需要javascript将任何内容返回给flash,这是必要的吗?
无论出于何种原因,我从未看到警报.有没有人在我的代码中看到任何问题?有ExternalInterface没有我没有的图书馆?另外,最好的使用方法是什么ExternalInterface(即错误检查等),在此先感谢...
我试图使用JS将数据发送到带有ExternalInterface的Flash AS2.0音乐播放器,除了我找不到有关ExternalInterface的好教程或指南.我希望能够通过单击JavaScript链接更改播放器中的当前歌曲,并在页面/窗口加载时不点击,播放默认歌曲.
我不需要在闪存等中加载声音的超级复杂的答案,我只是在让JS向Flash发送任何内容时遇到很多困难,当我开始工作时 - 我是否需要将一些if/else放入闪存以确定链接是否已被点击?
谢谢
编辑继承人现在的代码:
AS 2.0
import flash.external.ExternalInterface;
ExternalInterface.addCallback('loadSong', null, flashFunction);
function flashFunction (val) {
extra = val;
}
Run Code Online (Sandbox Code Playgroud)
JavaScript的
var flashObj = document.getElementById('VSPLAYER');
function loadSong(val) {
return val
}
Run Code Online (Sandbox Code Playgroud)
HTML
<a href="javascript:loadSong('2')">Play song 2</a>
<object id="VSPLAYER" type="application/x-shockwave-flash" data="vs_player.swf" width="280" height="90">
<param name="movie" value="vs_player.swf" />
<param name="allowscriptaccess" value="always" />
</object>
Run Code Online (Sandbox Code Playgroud) 我正在编写一个依赖外部javascript文件(我无法控制)的网页,它使用document.write返回数据.有没有办法动态调用函数而不覆盖整个文档?这是我能想到的最简洁的代码:
<html>
<head>
<script type="text/javascript">
function horriblefunction () {
document.write("new text");
}
</script>
</head>
<body>
Starting Text...
<div id="pleasewriteinme"></div>
Other text...
<button onclick="horriblefunction();">Click</button>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这个想法开始,不改变"horriblefunction()"(因为它是外部的)新文本可以放在div而不是覆盖页面.这是可能的,还是在创建页面时必须在div中调用函数?
谢谢你的帮助
flash ×7
javascript ×6
actionscript ×2
addcallback ×1
dom ×1
html ×1
memory-leaks ×1
security ×1
swfobject ×1