Вопрос

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

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

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

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

идентификатор, classid иallowScriptAccess установлены, как показано.

Есть идеи?

Редактировать 2:

Для Lior Cohen файл Flex является примером, используемым в вашей первой ссылке.Подкаталог History содержит 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, а не с внешним интерфейсом или объектом и встроенными тегами HTML.

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

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

Спасибо

Это было полезно?

Решение 3

Решение проблемы, упомянутой в «Редактировании 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 мог обеспечить полную функциональность, оболочка должна включать несколько вспомогательных файлов (среди прочих).

Дополнительную информацию о том, как получить и использовать эти вспомогательные файлы, можно найти по следующей ссылке в разделе «Развертывание приложений, использующих глубокие ссылки».

http://livedocs.adobe.com/flex/3/html/help.html?content=deep_linking_2.html

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

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

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

@ААА

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top