0

我编写了一个 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包含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 覆盖了整个页面(删除旧内容),这是我不想要的。

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>');

知道如何解决这个问题吗?

谢谢

4

5 回答 5

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

于 2009-08-12T15:15:14.867 回答
0

快速搜索显示您必须在对象上设置一些额外的属性才能使其在 IE 中工作。设置 id classId 和 scriptAccess (当然最后一个为“真”)以使其正常工作。(谷歌了解更多信息)

(未测试。)

http://www.google.com/search?q=externalinterface+internet+explorer

于 2009-08-12T12:52:47.313 回答
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:需要最后一行才能使其正常工作,并且必须在将对象添加到文档后的最后一行。我不知道为什么,可能与奇怪的浏览器行为有关。

于 2009-08-22T23:29:17.247 回答
0

@AAA

注2:需要最后一行才能使其正常工作,并且必须在将对象添加到文档后的最后一行。我不知道为什么,可能与奇怪的浏览器行为有关。

非常感谢你 !我想这是IE中的一个错误。我想知道你是怎么发现的。

于 2009-09-26T13:48:03.557 回答
0

使用 SWFObject(您可以在http://code.google.com/p/swfobject/找到它)将 Flash 放置在页面上也解决了 Internet Explorer 中的这个问题。

于 2010-06-28T12:54:58.880 回答