ExternalInterface.call(«окно.местоположение.хост.toString»)

#apache-flex #call #externalinterface #window.location

#apache-flex #вызов #внешний интерфейс #окно.Расположение

Вопрос:

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

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

Эта строка кода идеально подходит для получения строки host как в Firefox, так и в Opera. Однако при использовании IE возвращаемая строка всегда равна ‘null’. Мне нужно получить такую информацию из браузера. Я знаю, что есть обходной путь путем определения функции 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:

для Лиора Коэна файл 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 или тегами object и embed 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>');
  

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

Спасибо

Ответ №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. Хммм, я был счастлив, когда увидел такую встроенную поддержку. Однако я попробовал пример на этой странице, используя Firefox и IE, и он не получил никакой информации об URL. вы пробовали тот же пример и получили какие-либо результаты?

2. Вы обратили внимание на комментарии внизу страницы по предоставленной ссылке?

3. Прошу прощения, но, возможно, я чего-то не понимаю. Я понятия не имею, что это history.js файл. Я использую flex SDK и кодирую с помощью текстового редактора и компилирую с помощью mxmlc. Я не знаю, где это найти history.js чтобы включить его. есть идеи?

4. Извини, чувак. Я попытался включить history.js (и другие связанные файлы) однако, как указано в ссылке, похоже, ничего не изменилось. Мне кажется, что такая функция работоспособна только для обнаружения изменений URL, которые должны быть сделаны приложением, и для отслеживания истории текущего веб-сайта. Но я могу ошибаться

5. Не могли бы вы поделиться частью используемого вами кода, который не работает? Я уже использовал эти функции раньше, и они отлично работали.

Ответ №2:

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

(Не тестировалось.)

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

Комментарии:

1. не могли бы вы выразиться более ясно или предоставить ссылки или используемые ключевые слова для поиска. если вы имеете в виду allowScriptAccess=»всегда» в object и embed, то да, я уже это сделал. вызов javascript работает, однако значения, которые возвращаются из функций javascript, всегда равны нулю.

2. Итак, если вы уже установили allowScriptAccess, вы пытались добавить атрибуты id и classId?

3. да, идентификатор, classid и allowScriptAccess заданы как в тегах object, так и в тегах embed. Однако это все еще не работает в IE 🙁

4. Извините, в таком случае у меня нет никаких дополнительных предложений, кроме как попробовать несколько разных вызовов ExternalInterface и (что более важно) изменить идентификаторы элемента embed и object — делать их одинаковыми недопустимо или, по крайней мере, может сбить с толку (браузер).

5. Не беспокойтесь, я действительно ценю ваши предложения. И да, вы правы, идентификатор должен быть другим.

Ответ №3:

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

Ответ №4:

@AAA

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

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

Комментарии:

1. утомительный метод проб и ошибок 🙂 Я могу объяснить, почему так должно быть, но я просто счастлив, что это сработало, и еще более счастлив, что я смог сделать кого-то счастливым 🙂

Ответ №5:

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