ExternalInterface.call("window.location.host.toString")

Я написал гибкое приложение, которое получает строку хоста из браузера, используя этот код

ExternalInterface.call("window.location.host.toString")

Эта строка кода прекрасно работает для получения строки хоста как в Firefox, так и в Opera. Однако при использовании IE возвращаемая строка всегда равна нулю. Мне нужно получить такую ​​информацию из браузера. Я знаю, что есть обходной путь, определяющий функцию javascript, которая получает такую ​​строку, и вызывающий эту функцию из приложения. Однако мое приложение требует получения такой информации из собственного источника.

Мне было интересно, если бы у кого-то была такая же проблема и ей удалось ее решить, или у кого-то есть идеи, почему я всегда получаю нулевое значение в IE, но не при использовании Firefox и Opera

Изменить 1:

Вот HTML-код для встраивания сгенерированного SWF-файла. Может быть, это полезно, чтобы определить ошибку

<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:

for Lior Cohen Файл Flex - пример, использованный в вашей первой ссылке. История подкаталога содержит history.js, history.css и historyFrame.html. HTML-страница, содержащая сгенерированный SWF-файл, выглядит следующим образом

<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:

Я заметил проблему, но не могу ее исправить. Проблема связана с движком javascript IE, а не с ExternalInterface, не с объектом и тегами HTML.

В моем случае я пишу объект и внедряю теги в div, созданный с использованием javascript, и этот div добавляется в конец тела с помощью методов DOM. Однако такой подход заставляет InternalInterface всегда возвращать нуль в IE (но не в 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>');

Есть идеи, как это исправить?

Спасибо

5 ответов

Решение

Решение проблемы, которая упоминается в "Редактировании 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: последняя строка необходима для правильной работы, и она должна быть такой же и в конце после добавления объекта в документ. Я не знаю почему, возможно, это связано со странным поведением браузера.

Взгляните на следующую ссылку. Он должен предоставить вам то, что вы ищете, без использования 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

Использование SWFObject (вы найдете его по адресу http://code.google.com/p/swfobject/) для размещения Flash на странице также решает эту проблему в Internet Explorer.

@AAA

Примечание 2: последняя строка необходима для правильной работы, и она должна быть такой же и в конце после добавления объекта в документ. Я не знаю почему, возможно, это связано со странным поведением браузера.

Большое спасибо! Я полагаю, это ошибка в IE. Интересно, как ты узнал.

Быстрый поиск показывает, что вам нужно установить некоторые дополнительные атрибуты для объекта, чтобы он работал в IE. Установите id classId и scriptAccess (последний, конечно, на 'true'), чтобы заставить это работать. (Google для получения дополнительной информации)

(Не испытано.)

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

Другие вопросы по тегам