我编写了一个flex应用程序,使用此代码从浏览器中获取主机字符串
ExternalInterface.call("window.location.host.toString")
这行代码完全可以在Firefox和Opera中获取主机字符串。但是,使用IE时,返回的字符串始终为“null”。我需要从浏览器中获取此类信息。我知道有一个工作可以通过定义一个javascript函数来获取这样的字符串并从应用程序中调用该函数。但是,我的应用程序需要从本地来源获取此类信息。
我想知道是否有人遇到同样的问题并设法解决它,或者如果有人知道为什么我总是在IE中得到null,但在使用Firefox和Opera时却没有
编辑1:
以下是用于嵌入生成的SWF文件的HTML代码。也许这有助于发现错误
<object id="myTest1" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" height="330px" width="600px">
<param name="movie" value="http://www.website.com/test.swf" />
<param name="allowScriptAccess" value="always" />
<param name="wmode" value="transparent" />
<embed id="myTest1" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://www.website.com/test.swf" allowScriptAccess="always" wmode="transparent" height="330px" width="600px" flashvars=""></embed>
</object>
id,classid和allowScriptAccess设置如图所示
有什么想法吗?
编辑2:
为Lior Cohen Flex文件是第一个链接中使用的示例。子目录历史记录包含history.js,history.css和historyFrame.html。包含生成的SWF文件的HTML页面就像这样
<html>
<head>
<!-- BEGIN Browser History required section -->
<link rel="stylesheet" type="text/css" href="history/history.css"/>
<script src="history/history.js" language="javascript"></script>
<!-- END Browser History required section -->
</head>
<body>
<object id="file1" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" height="330px" width="600px">
<param name="movie" value="file.swf" />
<param name="allowScriptAccess" value="always" />
<param name="wmode" value="transparent" />
<embed id="file2" pluginspage="http://www.macromedia.com/go/getflashplayer" src="file.swf" allowScriptAccess="always" wmode="transparent" height="330px" width="600px" flashvars=""></embed>
</object>
<body>
</html>
但是,这仍然无法按预期工作。
编辑3:
我发现了这个问题,然而,我无法修复它。问题与IE的javascript引擎有关,而不是ExternalInterface,也没有对象和嵌入HTML标签。
我正在做的是将对象和嵌入标签写入使用javascript创建的div中,并使用DOM方法将div附加到正文的末尾。但是,这种方法使得InternalInterface在IE中总是返回null(但在Firefox和Opera中都不是)。
var swfDiv = document.createElement('div');
swfDiv.innerHTML = '<object id="test1" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="600" height="330"><param name="movie" value="http://www.website.com/test.swf" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="quality" value="high" /><embed id="test2" name="test2" src="http://www.website.com/test.swf" allowScriptAccess="always" allowFullScreen="false" quality="high" width="600" height="330" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /></object>';
document.body.appendChild(swfDiv);
我尝试使用document.write来附加HTML内容,这使得它在IE中完美运行,但是,document.write在整个页面上写入(删除旧内容),这是我不想要的。< / p>
document.write('<object id="test1" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="600" height="330"><param name="movie" value="http://www.website.com/test.swf" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="quality" value="high" /><embed id="test2" name="test2" src="http://www.website.com/test.swf" allowScriptAccess="always" allowFullScreen="false" quality="high" width="600" height="330" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /></object>');
知道如何解决这个问题吗?
由于
答案 0 :(得分:1)
看看以下链接。它应该为您提供您正在寻找的内容,而无需使用ExternalInterface.call()。
http://livedocs.adobe.com/flex/3/html/help.html?content=deep_linking_7.html
如上页所述,要使BrowserManager类提供其全部功能,包装器必须包含多个支持文件(history.js等)。
有关如何获取和使用这些支持文件的更多信息,请参阅“部署使用深层链接的应用程序”部分的以下链接。
http://livedocs.adobe.com/flex/3/html/help.html?content=deep_linking_2.html
答案 1 :(得分:0)
快速搜索显示您必须在对象上设置一些额外的属性才能使其在IE中运行。设置id classId和scriptAccess(当然最后一个为'true')以使其工作。 (谷歌了解更多信息)
(未经测试。)
http://www.google.com/search?q=externalinterface+internet+explorer
答案 2 :(得分:0)
“编辑3”中提到的问题的解决方案基本上是使用DOM对象创建对象标记及其参数标记,而不是仅将它们指定为innerHTML属性的字符串。这将使ExternalInterface的返回值在Internet Explorer中工作。这是一个例子:
var swfDiv = document.createElement('div');
var obj = document.createElement('object');
obj.setAttribute('id','test1');
obj.setAttribute('codebase','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0');
obj.setAttribute('width','600px');
obj.setAttribute('height','330px');
var param = document.createElement('param');
param.setAttribute('name','movie');
param.setAttribute('value','http://www.website.com/test.swf');
obj.appendChild(param);
param = document.createElement('param');
param.setAttribute('name','allowScriptAccess');
param.setAttribute('value','always');
obj.appendChild(param);
param = document.createElement('param');
param.setAttribute('name','wmode');
param.setAttribute('value','transparent');
obj.appendChild(param);
swfDiv.appendChild(obj);
document.body.appendChild(swfDiv);
document.getElementById('test1').setAttribute('classid','clsid:d27cdb6e-ae6d-11cf-96b8-444553540000');
注1:这将使其适用于Internet Explorer,任何其他浏览器都应使用上述问题“编辑3”中提到的任何方法。您可以检测浏览器并相应地使用正确的代码。
注2:最后一行是使其正常工作所必需的,它必须与此类似,并在将对象添加到文档后结束。我不知道为什么,可能与奇怪的浏览器行为有关。
答案 3 :(得分:0)
@AAA
注意2:最后一行是使它正常工作所必需的,它必须是这样的 将对象添加到文档后的结果。我不知道 为什么,可能与奇怪的浏览器行为有关。
非常感谢!我想这是IE中的一个错误。我想知道你是怎么发现的。
答案 4 :(得分:0)
使用SWFObject(您可以在http://code.google.com/p/swfobject/找到它)将Flash放在页面上也可以解决Internet Explorer中的这个问题。