我尝试将简单的测试消息从javascript发送到flash,但我收到了错误消息:
Object #<HTMLObjectElement> has no method "listenToJS"
我已经在堆栈上阅读了很多关于此问题的问题,但我觉得浏览器无法正确引用我的flash对象,或者在我的动作脚本中我没有将我的flash功能放在正确的位置的地方。
所以在html中我使用SWFObj嵌入flash:
<div id="flash_content">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="1280" height="800" id="tourFlash" name="pano" class="pano">
<param name="movie" value="VRDemo.swf" />
<param name="menu" value="false" />
<param name="wmode" value="transparent" />
<param name="allowscriptaccess" value="always" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="VRDemo.swf" width="1280" height="800" class="pano">
<param name="menu" value="false" />
<param name="wmode" value="transparent" />
<param name="allowscriptaccess" value="always" />
<param name="allownetworking" value="all" />
<param name="flashvars" value="zoom=null&pan=null&sound=null" />
<!--<![endif]-->
<a href="http://www.adobe.com/go/getflashplayer">
<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>
</div>
<script>
var flashObj;
$(document).ready(function(){
flashObj = document.getElementById('tourFlash');
$('#interface').click(function(){
console.log('click');
talkToFlash();
});
});
function talkToFlash(){
flashObj.listenToJS('hello from js');
}
function listenFromFlash(flashMessage){
console.log(message);
}
</script>
点击处理程序被触发,但在这里我得到了错误。我的flash文件使用文档类,而文档类中的是public函数。 Flash的结构如下:
package com.company.vr {
import flash.display.*;
import flash.events.*;
import com.greensock.*;
import com.greensock.easing.*;
import flash.external.ExternalInterface;
import flash.system.Security;
Security.allowDomain("*");
public class VR_TestDocument extends MovieClip {
public function VR_TestDocument() {
ExternalInterface.addCallback("talkToFlash", listenToJS);
}
public function listenToJS(message){
trace ("from js: " + message);
var flashMessage = message + " flash";
ExternalInterface.call("listenFromFlash", flashMessage);
}
}
}
--- --- UPDATE
看起来外部界面由于某种原因不喜欢SWFObject。如果我切换到嵌入该示例中使用的Flash的方法:
它有效,但我觉得swfobject是嵌入flash的最佳方式。有人有任何想法吗?
答案 0 :(得分:1)
如果您将html中的flash嵌入上面的代码中,请注意,第二个标记对象还必须包含属性 id ,更正后的代码位于:
<div id="flash_content">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="1280" height="800" id="tourFlash" name="pano" class="pano">
<param name="movie" value="VRDemo.swf" />
<param name="menu" value="false" />
<param name="wmode" value="transparent" />
<param name="allowscriptaccess" value="always" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="VRDemo.swf" width="1280" height="800" class="pano" id="tourFlash1">
<param name="menu" value="false" />
<param name="wmode" value="transparent" />
<param name="allowscriptaccess" value="always" />
<param name="allownetworking" value="all" />
<param name="flashvars" value="zoom=null&pan=null&sound=null" />
<!--<![endif]-->
<a href="http://www.adobe.com/go/getflashplayer">
<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>
但是,当然,swfobject是嵌入闪存的最佳方式。正确的HTML代码如下:
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>js</title>
<script type="text/javascript" src="swfobject.js"></script>
<script>
function talkToFlash(){
document.getElementById('flash_content').listenToJS('hello from js');
}
var flashvars = {};
var params = {
allowscriptaccess: "always"
}
var attributes = {};
swfobject.embedSWF("VRDemo.swf", "flash_content", "550", "400", "10.0.0", false, flashvars, params, attributes);
</script>
</head>
<body>
<div id="flash_content"></div>
</body>
</html>
- 更新 -
您必须在页面上选择正确的flash元素。 (取决于浏览器)。举个例子,这里是获取正确flashObj的代码:
flashObj1 = document.getElementById('tourFlash');
flashObj2 = document.getElementById('tourFlash1');
flashObj = flashObj1.talkToFlash != undefined ? flashObj1 : flashObj2;
答案 1 :(得分:0)
这很可能是一个时间问题 - Flash Player需要一点时间来初始化ExternalInterface,然后再花一点时间来加载SWF。您的示例代码在DOMReady上运行,这不保证SWF已加载或外部接口已在Flash Player中初始化。
我建议查询SWF以查看它是否已完成加载。在LearnSWFObject.com上有一个例子(使用动态发布):http://learnswfobject.com/advanced-topics/executing-javascript-when-the-swf-has-finished-loading/
更新:
重新阅读您的代码和其他一些建议的答案后,我发现您正在使用document.getElementById
抓住您的<object>
。使用嵌套的<object>
标记时,这将不起作用(IE中使用外部<object>
除外)。 swfobject.getObjectById
专门用于解决此问题。尝试编辑JS以使用swfobject.getObjectById
。