Javascript 当使用JS动态添加flash时,IE 6 7 8的外部接口问题

Javascript 当使用JS动态添加flash时,IE 6 7 8的外部接口问题,javascript,actionscript-3,externalinterface,Javascript,Actionscript 3,Externalinterface,获取ExternalInterface.callBack()时遇到问题;要在特定情况下工作,当我添加对象并动态嵌入标记时,如下所示: function createBannerObject(swfURL,flashVars, searchParams) { /* swfURL -- our template URL videoURL -- user video URL backURL -- background picture URL f

获取ExternalInterface.callBack()时遇到问题;要在特定情况下工作,当我添加对象并动态嵌入标记时,如下所示:

function createBannerObject(swfURL,flashVars, searchParams)
{
    /*  swfURL -- our template URL
        videoURL -- user video URL
        backURL -- background picture URL
        flashVars -- other user preferences -- string
        searchParam -- param for word search -- array  */

        var flashDiv = document.createElement('div');
        flashDiv.id = 'flashvideo';
        flashDiv.style.width='1px';
        flashDiv.style.height='1px';
        // id = myMovie, name = myMovie ------------------------//
        flashDiv.innerHTML = '<object id="myMovie" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="100%" height="100%" align="left"><param name="bgcolor" value="#faa"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+swfURL+'" /><param name="flashvars" value="'+flashVars+'" /><param name="quality" value="high" /><param name="wmode" value="opague" /><embed name="myMovie" src="'+swfURL+'" quality="high" width="100%" height="100%" align="left" allowScriptAccess="always" allowFullScreen="false" bgcolor="#cccccc" wmode="opaque" flashvars="'+flashVars+'" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /></object>';
        //----------------------------------------------------------
        var search = ad_createDomElem('div',false);
        search.style.display = 'none';
        var searchWord = ad_createDomElem('p',{'id':'keyword'});
        searchWord.innerHTML = searchParams[0];
        var searchDiv = ad_createDomElem('p',{'id':'search'});
        searchDiv.innerHTML = searchParams[1];
        var regex1 = ad_createDomElem('p',{'id':'regex1'});
        regex1.innerHTML = searchParams[2];
        var regex2 = ad_createDomElem('p',{'id':'regex2'});
        regex2.innerHTML = searchParams[3];
        search.appendChild(searchWord);
        search.appendChild(searchDiv);
        search.appendChild(regex1);
        search.appendChild(regex2);
        //-----------------------------------------------------------
        flashDiv.appendChild(search);
        //-----------------------------------------------------------
        document.body.appendChild(flashDiv);
}
这是它不工作的页面:

这是它的工作页面:区别在于flash不是动态添加的:

所有JS都可以通过source=)进行屏蔽

现在关于AS3,我使用代码:

Security.allowDomain('*');
ExternalInterface.addCallback("playVideoOnOpen", playVideoOnOpen);
ExternalInterface.addCallback("pauseVideoOnClose", pauseVideoOnClose);

function playVideoOnOpen()
{

}

function pauseVideoOnClose()
{

}
我已经成功地隔离了这样的问题:

所有的JS都在里面


问题:当我动态添加flash时,可能会出现什么问题?还是其他原因?

如果使用swfobject.js嵌入swf,那么问题就会消失。我一直使用它与外部接口,从来没有你的问题。
您也没有将要传递给函数的数据过帐。

正如您在下面的代码中所看到的,它也更加清晰和自我解释

html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">

function loaded() {
  var flashvars={}, params={}, attributes={}, tmp, version, width, height, container, flashObj;
  flashvars.userId    = "1234";

  params.menu = "true";
  params.quality = "high";
  params.allowscriptaccess = "always";
  params.allownetworking = "all";

  attributes.id = "test";
  attributes.name = "test";
  attributes.align = "middle";
  attributes.allowscriptaccess = "always";
  attributes.allownetworking = "all";

  tmp = "expressInstall.swf";
  version = "10.0.0";
  width = "100%";
  height = "100%";
  container = "replaceMe";// div tag to place the swf in
  flashObj = "test.swf?t=" + new Date().getTime(); // anticaching
  swfobject.embedSWF(flashObj, container, width, height, version, tmp, flashvars, params, attributes);
}

</script>
  </head>
  <body onLoad="loaded()" onunload"doUnload( )">
    <div id="replaceMe">Loading content.</div>
  </body>
</html>

@Olga这是一种纯JavaScript的嵌入方法。我不明白这是怎么回事。js是一个700行的文件,不是库。JS文件是缓存的,因此用户无需重新加载。@Olga抱歉,我在帖子中添加了更多内容。我忘记了容器引用函数。只想添加SWFObject.js是一个25kb的文件。这可以通过混淆页面上的条幅(还有700行代码)来减少。您不需要将SWFObject中的代码添加到脚本中,只需为它们提供使用其中函数的代码。说真的,你需要功能化一些东西,比如,你应该传递回你的“客户机”的唯一代码是一个函数调用,参数是从他们的选项设置的。如果你愿意,我可以给你一个很好的解释为什么不,只是不在这里,我们已经在创建垃圾邮件!
html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">

function loaded() {
  var flashvars={}, params={}, attributes={}, tmp, version, width, height, container, flashObj;
  flashvars.userId    = "1234";

  params.menu = "true";
  params.quality = "high";
  params.allowscriptaccess = "always";
  params.allownetworking = "all";

  attributes.id = "test";
  attributes.name = "test";
  attributes.align = "middle";
  attributes.allowscriptaccess = "always";
  attributes.allownetworking = "all";

  tmp = "expressInstall.swf";
  version = "10.0.0";
  width = "100%";
  height = "100%";
  container = "replaceMe";// div tag to place the swf in
  flashObj = "test.swf?t=" + new Date().getTime(); // anticaching
  swfobject.embedSWF(flashObj, container, width, height, version, tmp, flashvars, params, attributes);
}

</script>
  </head>
  <body onLoad="loaded()" onunload"doUnload( )">
    <div id="replaceMe">Loading content.</div>
  </body>
</html>
if (navigator.appName.indexOf("Microsoft") >= 0){
    container = document;
}else{
    container = window;
}
var result = container[swf].flashCallBackFunction();