Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.04.2008, 17:31
ashDesigner вне форума Посмотреть профиль Отправить личное сообщение для ashDesigner Посетить домашнюю страницу ashDesigner Найти все сообщения от ashDesigner
  № 1  
Ответить с цитированием
ashDesigner

Регистрация: Apr 2004
Сообщений: 37
Отправить сообщение для ashDesigner с помощью ICQ
Tip Проблема с вызовом ExternalInterface.call в Opera

Хочу поделиться опытом решения проблемы вызова функции ExternalInterface.call для браузера Opera 9.25+ (более ранние версии не тестировались).

Возникла следующая трудность.

У меня был клип меню для сайта, структура которого загружалась из XML, а дальше программно создавались кнопки, вложенное меню и т.п. При этом обработчики событий для кнопок-пунктов меню и анимация для их появления задавалась также программно.

Фишка меню состоит в том, что оно 2-уровневое и пункты, которые содержат вложения, плавно разворачиваются/сворачиваются по нажатию на них. В связи с этим возникла необходимость динамического изменения высоты объекта (flash-ролика swf) в браузере средствами JavaScript. Для решения этой проблемы была создана js-функция matchClipSize(width, height), которая и изменяла высоту клипа по запросу. (Для реализации этой фнукции в JS был использован фреймворк MooTools, а для внедрения клипа в HTML - SWFObject 2.0, если кому-то это интересно).

Таким образом, при разворачивании/сворачивании меню из ролика вызывался метод:

Код:
import mx.transitions.Tween;
import flash.external.*;

<...>

function resizeMovieJS(jsWidth, jsHeight) {

	<...>
	ExternalInterface.call("matchClipSize", jsWidth, jsHeight);
}
При этом при разворачивании пункта меню JS вызывался до события разворачивания, а при сворачивании пункта - после. Для того, чтобы отследить событие окончания сворачивания пункта меню (программная анимация), пришлось ставить слушатель:

Код:
function unfoldMenu() {

	<...>

	if (!unfoldItem) { // Если нужно свернуть объект, то придется дождаться окончания анимации

		tweenObject.onMotionFinished = function() {

			_root.resizeMovieJS(mWidth, mHeight);
		}
	}
	else { // ...а если развернуть - то сначала изменить размеры клипа, а только потом запустить анимацию

		_root.resizeMovieJS(mWidth, mHeight);
	}

	tweenObject.start(); // Запуск программной анимации.
}
А теперь - СУТЬ ПРОБЛЕМЫ. В общем, при отладке ролика выяснилось, что все браузеры (даже IE) работают корректно - за исключением Opera (у меня была версия 9.25 с Flash Player 9). Баг Opera состоял в том, что flash-плеер не хотел вызывать метод ExternalInterface.call из простых функций в корне клипа (в моем случае - unfoldMenu) - зато отлично вызывал этот метод из обработчика tweenObject.onMotionFinished.

Решение проблемы
Никакие ухищрения и мой здравый смысл (а также переустановка FlashPlayer и обновление до Opera 9.27) не помогали, пока я не решился сделать вот это внутри функции unfoldMenu():

Код:
function unfoldMenu() {

	<...>

	if (!unfoldItem) { // Если нужно свернуть объект, то придется дождаться окончания анимации

		tweenObject.onMotionFinished = function() {

			_root.resizeMovieJS(mWidth, mHeight);
		}
	}
	else { // ...а если развернуть - то сначала изменить размеры клипа, а только потом запустить анимацию

		// _root.resizeMovieJS(mWidth, mHeight); - этот способ не работает в Opera!

		_root.operaBugInterval = setInterval(_root, "resizeMovieJS", 1, mWidth, mHeight);

	}

	tweenObject.start(); // Запуск программной анимации.
}
То есть, мною было найдено только одно решение проблемы: установить небольшой таймер для вызова этой функции. Да, ну и, разумеется, пришлось очищать таймер в самой функции вызова JS:

Код:
function resizeMovieJS(jsWidth, jsHeight) {

	<...>

	if (_root.operaBugInterval != undefined) {
		
		clearInterval(_root.operaBugInterval);
	}

	ExternalInterface.call("matchClipSize", jsWidth, jsHeight);
}
Таким образом мною был сделан вывод, что в браузере Opera есть баг FlashPlayer 9, который некорректно вызывает ExternalInterface.call из простых функций, не связанных со слушателями событий. Так это реально или нет, разбираться у меня не было времени - а кроме того, глючила только Opera, да и AS-код, кажется, у меня нормальный.

Одним словом, я надеюсь, что мой пост поможет кому-то, кто (не дай бог, конечно ) столкнется с такой узкоспецифической проблемой)) Всем, кто дочитал мой пост до конца - спасибо за внимание! Буду рад, если кто-то выскажет пару умных мыслей насчет описанной проблемы, т.к. в форуме я ничего подходящего не нашел.

P.S. Работающую версию описанного выше скрипта меню смотрите на этом проекте: www.ilove-you.ru
__________________
:: Anthony ::

Старый 21.04.2008, 19:04
ashDesigner вне форума Посмотреть профиль Отправить личное сообщение для ashDesigner Посетить домашнюю страницу ashDesigner Найти все сообщения от ashDesigner
  № 2  
Ответить с цитированием
ashDesigner

Регистрация: Apr 2004
Сообщений: 37
Отправить сообщение для ashDesigner с помощью ICQ
Да, забыл сказать, что данная проблема была обнаружена на платформе WinXP FlashPlayer 9, протестирована и ликвидирована для браузеров: IE 6.0, FF 2.0.0.14, Safari 3.0.3, Opera 9.25 - 9.27. IE 7.0 XP/Vista не тестировался.
__________________
:: Anthony ::

Старый 06.05.2009, 02:05
Fernando Costa вне форума Посмотреть профиль Отправить личное сообщение для Fernando Costa Найти все сообщения от Fernando Costa
  № 3  
Ответить с цитированием
Fernando Costa
 
Аватар для Fernando Costa

Регистрация: Oct 2006
Адрес: simferopol -> kyiv
Сообщений: 2,161
Отправить сообщение для Fernando Costa с помощью ICQ
Кто-нибудь сталкивался с такой проблемой и решил ее более умоваримым путем? В часности для третьего скрипта.
__________________
: M F N W :

Старый 06.05.2009, 04:52
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Попробуй getURL("javascript:<javascript code>")
Я сталкивался с похожей проблемой, но не совсем... в AS2 EI некорректно экранит кавычки, поэтому пришлось имитировать вот таким образом... в AS3 вроде такого не наблюдалось...
__________________
Hell is the possibility of sanity

Старый 09.05.2009, 02:42
ashDesigner вне форума Посмотреть профиль Отправить личное сообщение для ashDesigner Посетить домашнюю страницу ashDesigner Найти все сообщения от ashDesigner
  № 5  
Ответить с цитированием
ashDesigner

Регистрация: Apr 2004
Сообщений: 37
Отправить сообщение для ashDesigner с помощью ICQ
Цитата:
Сообщение от Fernando Costa Посмотреть сообщение
Кто-нибудь сталкивался с такой проблемой и решил ее более умоваримым путем? В часности для третьего скрипта.
Гм... Кхм... Спасибо за комплимент, я польщен)) Это стоило того, чтобы мне написать свой первый мини-пост)) Может, его вообще тогда удалить?
__________________
:: Anthony ::

Старый 14.05.2009, 20:43
Fernando Costa вне форума Посмотреть профиль Отправить личное сообщение для Fernando Costa Найти все сообщения от Fernando Costa
  № 6  
Ответить с цитированием
Fernando Costa
 
Аватар для Fernando Costa

Регистрация: Oct 2006
Адрес: simferopol -> kyiv
Сообщений: 2,161
Отправить сообщение для Fernando Costa с помощью ICQ
Цитата:
Сообщение от ashDesigner Посмотреть сообщение
Гм... Кхм... Спасибо за комплимент, я польщен)) Это стоило того, чтобы мне написать свой первый мини-пост)) Может, его вообще тогда удалить?
Да что вы. Мне наоборот очень помогли ваши старания, вы меня неправильно поняли. Меня интересовало другое - возможно за такой промежуток времени эта бага уже латается другим путем.

Спасибо
__________________
: M F N W :

Старый 15.05.2009, 19:52
ashDesigner вне форума Посмотреть профиль Отправить личное сообщение для ashDesigner Посетить домашнюю страницу ashDesigner Найти все сообщения от ashDesigner
  № 7  
Ответить с цитированием
ashDesigner

Регистрация: Apr 2004
Сообщений: 37
Отправить сообщение для ashDesigner с помощью ICQ
Ок)) тогда я спокоен)) а проблема, действительно, очень узкоспецифична. Я даже не думал, что кому-нибудь тоже придется с ней столкнуться.
__________________
:: Anthony ::

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:43.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 15:43.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.