Javascript.RU

Javascript <-> Flash мост

Эта статья описывает, как вызывать из Javascript методы Flash и наоборот.

Используя эти способы, javascript может получить доступ к буферу обмена ОС, хранимым объектам SharedObject, управлять flash-интерфейсами и многое другое.

Какой бы способ коммуникации мы не выбрали, для начала JS должен уметь находить объект Flash на странице.

Для того, чтобы все работало кроссбраузерно, Flash-ролик нужно вставить с использованием обоих тегов: object и embed, например так:

<object 
    id="BridgeMovie" width="400" height="200"        
    classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"   
 codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
    <param name="movie" value="bridge.swf" />
    <param name="allowScriptAccess" value="sameDomain" />
    <embed
        src="bridge.swf" 
        name="BridgeMovie" align="middle"
        play="true" loop="false" quality="high" allowScriptAccess="sameDomain"
        width="400" height="200" scale="exactfit" 
        type="application/x-shockwave-flash"
        pluginspage="http://www.macromedia.com/go/getflashplayer">
    </embed>
</object>

В этом примере существенны детали:

  1. Имя ролика BridgeMovie дублируется как object.id и embed.name.
  2. Путь к ролику bridge.swf дублируется в object/embed
  3. Параметр allowScriptAccess="sameDomain"
  4. Дублируются размеры ролика

Теперь объект ролика можно получить из window["BridgeMovie"] для IE или document["BridgeMovie"] в остальных браузерах:

function getMovie() {
    var M$ =  navigator.appName.indexOf("Microsoft")!=-1
    return (M$ ? window : document)["BridgeMovie"]
}

Далее мы разберем средства для коммуникации с этим роликом.

Самый древний, знакомый большинству флешеров способ - это вызов javascript-функции посредством getURL с протоколом javascript:

getURL('javascript:функция("параметры");');
  • Работает во всех броузерах
  • Flash 5 и выше
  • Прост в применении
  • Не возвращает результат
  • Длина передаваемой строки ограничена 508 символами.

Вызов осуществляется так:

fsCommand("функция", "параметры")

Чтобы принять этот вызов, в Javascript должна быть специальная обвязка.

Редактор Macromedia Flash может генерировать ее автоматически при публикации ролика.

Для этого нужно в Publish Settings:

  1. Во вкладке Formats включить публикацию html-файла
  2. Во вкладке HTML выбрать Template: Flash with FSCommand

Генерируемый шаблон javascript-обвязки состоит из двух частей: функция обработки и дополнительного кода для IE.

Название функции имеет вид <ИмяРолика>_DoFSCommand. В нашем случае это BridgeMovie_DoFSCommand

Первый аргумент - имя вызываемой функции, второй - строка аргументов.
Простейший вариант выглядит так:

function BridgeMovie_DoFSCommand(command, args) {
    // вызвать функцию command с аргументом args
    window[command].call(null, args)
}

Вызов, например, функции show из Flash приведет к цепочке вызовов:

  1. (Flash) fsCommand("show","something")
  2. (JS) BridgeMovie_DoFSCommand("show","something")
  3. (JS) show("something")

Этот код нужен только для IE под Windows, в дополнение к BridgeMovie_DoFSCommand, так как в этом браузере fsCommand вызывает не Javascript, а VBScript.

if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 
&& navigator.userAgent.indexOf("Windows") != -1) {
        document.write('<script language=\"VBScript\"\>\n');
        document.write('On Error Resume Next\n');
        document.write('Sub BridgeMovie_FSCommand(ByVal command, ByVal args)\n');
        document.write('        Call BridgeMovie_DoFSCommand(command, args)\n');
        document.write('End Sub\n');
        document.write('</script\>\n');
}

Здесь VBScript просто передает вызов Javascript'у.

Итак, плюсы и минусы метода fscommand:

  • Flash 5 и выше
  • Не работает под Mac OS
  • Не возвращает результат
  • Нужен дополнительный JS-код

Этот способ работает, начиная с Flash 8. В отличие от всех предыдущих способов, он не только вызывает javascript, но и передает обратно возвращаемое значение, по возможности сохраняя его тип.

import flash.external.ExternalInterface;
var result = ExternalInterface.call("func", "param1", "param2", ...);

К сожалению, начиная с Flash 8, где он впервые появился, в ExternalInterface нашли большое количество разнообразных багов. Глюки сериализации, самопроизвольное изменение передаваемых данных и т.п.

Эти ошибки поправлены в новейших версиях Flash Player, но многие продолжают использовать более старые редакции Flash 8,9.

Актуальную информацию об ошибках можно получить из google, набрав "ExternalInterface bug".

  • Простота
  • Возвращает результат
  • Разнообразные баги, в отличие от предыдущих способов

Самый простой способ - установка переменной ролику:

getMovie().SetVariable("message","data")

Обратите внимание - именно SetVariable, не setVariable. Регистр здесь важен.

Чтобы Flash получил значение - можно проверять сообщения, например, на каждом кадре. Это около 12 раз в секунду.

Следующий код срабатывает на каждом кадре и ждет появления значения переменной message.

var message = null
_root.onEnterFrame = function() {
	if (message!==null)	{
		_root.txtRecieve.text = message // получили сообщение
		message = null
	}
}
  • Простота и надежность
  • Кросс-браузерность, Flash 5+
  • Дорога в одну сторону, не больше одного сообщения за кадр.

Применив ExternalInterface из Flash8+, можно объявить флеш-метод, который будет обрабатывать вызовы из javascript.

Формат вызова:

ExternalInterface.addCallback(функция JS, объект Flash, функция Flash);.

Например, следующий код устанавливает глобальную функцию recieveFromJS как обработчик JS-вызова sendFromJS.

import flash.external.ExternalInterface;
...

ExternalInterface.addCallback("sendFromJS", null, recieveFromJS);

function recieveFromJS(msg) {
	_root.txtRecieve.text = msg;
}

В JS достаточно сделать простой вызов:

getMovie().sendFromJS(value);
  • Можно тут же получить значение из Flash
  • Множество багов в ExternalInterface.

Можно также использовать LocalConnection, как это сделано во Flash-Javascript Integration Kit.

Этот пример пересылает текст из верхнего JS-поля направо во Flash, из нижнего Flash-поля - налево в JS.

Вводите любой, текст и жмите кнопку для пересылки нужным методом.

Послать из JS во Flash:
->
<-
// Flash Storage example

import flash.external.ExternalInterface;

ExternalInterface.addCallback("sendFromJS", null, recieveFromJS);

function recieveFromJS(msg) {
	_root.txtRecieve.text = msg;
}


_root.button.onRelease = function() {
	fscommand("recieveFromFlash", _root.txtSend.text);
}

_root.button2.onRelease = function() {
	ExternalInterface.call("recieveFromFlash", _root.txtSend.text);
}

_root.button3.onRelease = function() {
	var txt = _root.txtSend.text.split('"').join('\\"')
	getURL('javascript:recieveFromFlash("'+txt+'");');
}

var message = null

_root.onEnterFrame = function() {
	if (message!==null)	{
		_root.txtRecieve.text = message
		message = null
	}
}

Скачать .fla - исходник флешки.

function recieveFromFlash(Txt) {
        document.getElementById('txtRecieve').value = Txt;
}

function getMovie() {
        var M$ =  navigator.appName.indexOf("Microsoft")!=-1
        return (M$ ? window : document)["BridgeMovie"]
}


function sendSetVariable() {
        var value = document.getElementById('txtSend').value

        var movie = getMovie()
        movie.SetVariable("message", value)
}


function sendExternalInterface() {
        var value = document.getElementById('txtSend').value

        var movie = getMovie()

        movie.sendFromJS(value);
}

/* movie name_DoFSCommand */
function BridgeMovie_DoFSCommand(command, args) {
        window[command].call(null, args)
}


// Hook for Internet Explorer.
if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 && 
navigator.userAgent.indexOf("Windows") != -1) {
        document.write('<script language=\"VBScript\"\>\n');
        document.write('On Error Resume Next\n');
        document.write('Sub BridgeMovie_FSCommand(ByVal command, ByVal args)\n');
        document.write('        Call BridgeMovie_DoFSCommand(command, args)\n');
        document.write('End Sub\n');
        document.write('</script\>\n');
}

По просьбам читателей - примеры и исходники вынесены на отдельную страницу.

Успешной интеграции!


Автор: volksdesign, дата: 22 мая, 2008 - 16:38
#permalink

Здравствуйте меня интересует маленький вопросик по поводу вот Этого кода

function getMovie() {
    var M$ =  navigator.appName.indexOf("Microsoft")!=-1
    return (M$ ? window : document)["BridgeMovie"]
}

При Вставке Flash в форму данное обращение необрабатывается в Explorer!!!

<form name="test" id="1">
<object 
    id="BridgeMovie" width="400" height="200"        
    classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"  
  codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
    <param name="movie" value="bridge.swf" />
    <param name="allowScriptAccess" value="sameDomain" />
    <embed
        src="bridge.swf" 
        name="BridgeMovie" align="middle"
        play="true" loop="false" quality="high" allowScriptAccess="sameDomain"
        width="400" height="200" scale="exactfit" 
        type="application/x-shockwave-flash"
        pluginspage="http://www.macromedia.com/go/getflashplayer">
    </embed>
</object>
</form>

Если у вас будет время помогите решить данную сетуацию!!!


Автор: Илья Кантор, дата: 2 августа, 2008 - 14:02
#permalink

Честно - вопрос нихрена не понял. Какое обращение не обрабатывается и что при этом выдает.

Попробуйте примеры на отдельных страницах.


Автор: Евгений Колосов (не зарегистрирован), дата: 31 мая, 2008 - 12:10
#permalink

Большое спасибо за такие наглядные примеры - Ваш сайт, наверное, лучший путеводитель по JS в рунете. По крайней мере, мне, гуманитарию, все понятно!


Автор: Rodriguez, дата: 4 июня, 2008 - 10:31
#permalink

Добрый день.

Вы не могли мне подсказать:
getURL('javascript:функция("параметры");');
Не отрабатывается в последней версии флэша. Т.е. вообще не происходит ни каких событий. Вызов функции не осуществляется. Когда стояла версия 8,0,22,0 все отрабатывалось.

К примеру, на нажатие на кнопку во флэше вешаем getURL('javascript:alert('test');');

А алерт вызывался когда стояла версия 8,0,22,0. Но стоило обновить до последней, то перестал. Может ктонибудь сталкивался с подобной проблемой? Или возможно после обновления какието настройки безопасности флэша поменялись?

Заранее благодарю!


Автор: Ajaxy (не зарегистрирован), дата: 30 июня, 2008 - 23:23
#permalink

ну если так кавычки ставить, то не будет работать
если это частная опечатка, тогда не знаю..


Автор: Tomas (не зарегистрирован), дата: 5 июня, 2008 - 18:18
#permalink

Огромное спасибо за этот пример, уже как год хотел научиться делать такой мост. Раньше просто не получалось, потом вообще забил, а теперь умею
Big thanks


Автор: читатель (не зарегистрирован), дата: 13 июня, 2008 - 19:05
#permalink

Спасибо за детальное описание. Действительно понятно даже начинающему.


Автор: Ajaxy (не зарегистрирован), дата: 30 июня, 2008 - 23:26
#permalink

Здравствуйте.
Прекрасная статья, спасибо!
одно замечание - MSIE 7.0 осуществляет доступ к объекту так же через объект document, вместо объекта window.


Автор: Mr. DEE (не зарегистрирован), дата: 26 июля, 2008 - 21:58
#permalink

Странно, но на локальной машине у меня не заработал ни один из ваших способов, флэш плеер 10 Sad
Очень нужно решение и я его так и не нашел. Настройки безопасности вроде сделал...


Автор: Илья Кантор, дата: 28 июля, 2008 - 12:50
#permalink

Без информации о том, какая машина (ОС, браузер), и что именно не заработало - посоветовать ничего нельзя..


Автор: Валерий (не зарегистрирован), дата: 21 апреля, 2009 - 23:42
#permalink

Я тоже на локальной машине (запуская HTML минуя сервер) не могу получить вызов JS, а надо именно на локальной. OS WinXP Firefox 3.08


Автор: Валерий (не зарегистрирован), дата: 22 апреля, 2009 - 00:00
#permalink

Сам нашел ответ. При вызове плейера нужно использовать параметр 'allowScriptAccess','always'


Автор: Berds (не зарегистрирован), дата: 24 сентября, 2009 - 22:45
#permalink

Ты лучший. Я пару часов потратил на поиски ответа и вот он !!! Все работает и на локальном компьютере.


Автор: Гость (не зарегистрирован), дата: 15 февраля, 2014 - 00:33
#permalink

Подскажите пожалуйста, почему когда я копирую ваш пример и вашу флэшку локально то пример перестает работать?


Автор: Константин (не зарегистрирован), дата: 2 августа, 2008 - 08:56
#permalink

Здравствуйте!

Читал, что метод SetVariable не работает для OS Mac,
а ExternalInterface работает - правда ли это?

Пробовал делать пересылку из js - flash методом ExternalInterface (OS Windows XP, Flash 8, IE7) - не работает, в чем может быть дело?

Вы пишете, что Flash 8 устарел - а какие не устарели и где их можно скачать?
Было бы неплохо, если бы выложили исходник тестовой страницы целиком,
а также флэш-исходник для Flash 8.
Буду благодарен за ответы на мои вопросы.Всго хорошего


Автор: Илья Кантор, дата: 2 августа, 2008 - 13:47
#permalink

Исходники и примеры выложены, см. конец статьи. То, что Вы слышали про Mac OS, имхо не верно, но все же попросите маковода тестануть


Автор: Константин (не зарегистрирован), дата: 2 августа, 2008 - 14:43
#permalink

Благодарю за ответ, однако скачал с выложенных примеров исходники bridge.fla, example2.fla - во Flash 8 они не открываются, пишет "unexpected file format" Можно ли их сохранить в Flash 8, будет ли в этом флэше работать пересылка?


Автор: Илья Кантор, дата: 2 августа, 2008 - 18:52
#permalink

Откройте их в более старшей версии флеш и сохраните в формате Flash8


Автор: Алексей (не зарегистрирован), дата: 5 сентября, 2008 - 14:02
#permalink

интересная особенность проявилась:
у меня есть некая флешка на странице. она лежит в блоке div. у этого div'a стоит свойство visibility в значение hidden

чего я хочу:
1. флешка загрузилась
2. Внутри флешки обрабатывается команда о завершении загрузки этой флешки
3. Эта команда вызывает функцию на страничке, которая ставит visibility блока div в значение visible.
4. Флешку (и все, что в этом блоке помимо нее) видно, все радуются

что получается сейчас:
1. Флешка загрузилась
2. Событие не отработалось

Судя по тому, что функция вызывается, когда блок div имеет visibility: visible, у меня возникают подозрения, что действия флешки игнорируются из-за этого свойства (мол, не видно слой, значит и работать ему нельзя).

Вопрос, я прав в своих домыслах? Если да, то каким способом я могу вызвать из флешки метод джаваскрипта?
Добавление флешки на страницу идет через swfObject


Автор: Илья Кантор, дата: 11 ноября, 2008 - 01:58
#permalink

Не знаю насчет visible, но с display:none такое видел. Если флешка не видна, то она не работает, и событие прислать не может.


Автор: SandZ, дата: 17 февраля, 2010 - 12:34
#permalink

Можно див з-индексом опутить под страницу, а когда понадобится - поднять


Автор: Скрипт (не зарегистрирован), дата: 30 октября, 2008 - 21:53
#permalink

Раньше знал только как из flash вызывать функции javascript, а теперь знаю и то и то , благодаря этой статье
Ух, теперь я напишу то что хотел


Автор: m4d (не зарегистрирован), дата: 11 ноября, 2008 - 01:40
#permalink

Здравствуйте, а можно ли вытащить переменную из flash без изменения swf'ки?
Например, есть готовый swf-объект на странице, из него нужно взять переменную txtField. Если честно - нужно это сделать на чужой странице:) С хтмлом могу делать что угодно, но флэшки ни местонахождение, ни параметры, ни тем более код менять нельзя. Посоветуете?


Автор: Добарин Сергей (не зарегистрирован), дата: 11 декабря, 2008 - 23:49
#permalink

Немного не ясно что Вы имеете в виду.
Возможность считывать динамически переменную флешки либо просто добраться до хранимого в ней значения?
То есть интересует Вас контент переменной или возможность скажем подгребать ее значение тем же джаваскриптом например?

Например можно попробовать следующее:
1. Создаем новый флеш проэкт.
2. Создаем там загрузчик и загружем в него интересующую нас флешку.
3. обходим в циклах все уровни загруженной флешки и выводим все переменные и их значения. Находим нужную и путь к ней.
4. В исходном проэкте создаем функцию которая считывает конкретно нужную нам переменную в нужное время, либо подписываемся на ее изменение.
5. Выводим полученное значение в куда нам уже нужно, в тот же самый джаваскрипт.
6. Получаем новую флешку, которая все что делает это загружает в себя нужную нам, вытаскивает из нее значение переменной и отправляет его дальше.


Автор: Download YouTube Video (не зарегистрирован), дата: 5 января, 2009 - 23:23
#permalink

Спасибо! Сегодня целий день в нете рисчил - один спам нашел, а здесь все четко и ясно. Thanks =)


Автор: Руслан (не зарегистрирован), дата: 3 февраля, 2009 - 15:50
#permalink

Статья супер, но у меня очень смешная ситуация: Сделал как все сказали, вызываю js функцию через ExternalInterface, ни в одном браузере не работает... НО!!! Представьте себе работает в лисе в IE TAB (мож кто не знает это плагин к лисе такой, он отображает страницу как это делает IE), в самом IE НЕ пашет а в лисе в IE TAB пашет!!!

Че за фигня?....

если кто знает что делать, напишите плз. очень надо на: code_master@mail.ru

p.s. Спасибо за ОТЛИЧНУЮ СТАТЬЮ!!!


Автор: Руслан (не зарегистрирован), дата: 4 февраля, 2009 - 10:52
#permalink

Виноват, извиняюсь, тестировал на локальном компе, поэтому и пахало, вылил на удаленный сервер, все заработало


Автор: blink183 (не зарегистрирован), дата: 8 февраля, 2009 - 18:38
#permalink

СУПЕР просто! всё понятно... мне очень помогло!!!!!


Автор: Кирилл (не зарегистрирован), дата: 18 февраля, 2009 - 02:28
#permalink

Здравствуйте. Не могли бы Вы сами сохранить файл example.fla из
Демка приема-передачи через ExternalInterface
чтобы он открывался в Flash 8, т.к. у меня да и у многих пользователей, я думаю, нет возможности найти старший плеер...


Автор: Илья Кантор, дата: 23 апреля, 2009 - 09:45
#permalink

Вы можете легко получить плеер самой последней версии здесь: http://get.adobe.com/flashplayer/


Автор: Кирилл (не зарегистрирован), дата: 18 февраля, 2009 - 02:43
#permalink

ExternalInterface
К сожалению, начиная с Flash 8, где он впервые появился, в ExternalInterface нашли большое количество разнообразных багов. Глюки сериализации, самопроизвольное изменение передаваемых данных и т.п.
Эти ошибки поправлены в новейших версиях Flash Player, но многие продолжают использовать более старые редакции Flash 8,9

Всвязи с этим вопрос... Здесь имеется ввиду версия самого плеера, или компилятора (ПО в котором создавался FLA, затем SWF файл)?


Автор: Илья Кантор, дата: 23 апреля, 2009 - 09:43
#permalink

Имеется в виду версия самого плеера.


Автор: Гость (не зарегистрирован), дата: 24 февраля, 2009 - 16:04
#permalink

Огромное спасибо за статью.
Четко и в полной мере. Почаще бы такие подсказки попадались!


Автор: Алексей эС Вэ (не зарегистрирован), дата: 14 мая, 2009 - 16:58
#permalink

Огромное спасибо, просто блеск!


Автор: Гость (не зарегистрирован), дата: 27 мая, 2009 - 20:23
#permalink

описанный пример работает в IE, но запустить его в OPERA не получилось. Броузер просто не видит объект. То есть не работает ссылка ни window["objectname"] ни document["objectname"]. Кто нибудь может указать в каком направлении копать?


Автор: Илья Кантор, дата: 27 мая, 2009 - 20:36
#permalink

Opera, случайно, не под Linux ?


Автор: Гость (не зарегистрирован), дата: 27 мая, 2009 - 22:36
#permalink

Opera 9.51 под winXP AC 3.6.0


Автор: Dimon41 (не зарегистрирован), дата: 17 июня, 2009 - 16:40
#permalink

Материал супер , но не подскажете как изменить функцыю

function getMovie() {
var M$ = navigator.appName.indexOf("Microsoft")!=-1
return (M$ ? window : document)["BridgeMovie"]
}

чтоб она работала с неопределеным именем ролика на пример getMovie(movie);
где movie это переменая


Автор: Илья Кантор, дата: 18 июня, 2009 - 00:29
#permalink
function getMovie(movie) {
var M$ = navigator.appName.indexOf("Microsoft")!=-1
return (M$ ? window : document)[movie]
}

?


Автор: Гость (не зарегистрирован), дата: 23 сентября, 2009 - 10:28
#permalink

+стопитьсот


Автор: AZM.SU (не зарегистрирован), дата: 4 августа, 2009 - 00:00
#permalink
getMovie().SetVariable("_root.message","data");
getMovie().TCallLabel('_root','kadr');

позволит выполнить код в кадре "kadr" вместо того, что бы крутить
if (message!==null){ ... }
Причём кадр этот может лежать в отдельной сцене, где первы кадр содержит
stop();
а второй "kadr" - обработчик на приход данных и данные будут обработаны незамедлительно.


Автор: Гость (не зарегистрирован), дата: 30 сентября, 2009 - 22:30
#permalink

день добрый
можете подсказать

я вставлю невидимый флеш
из Javascript передам значение во Flash
а из флешевского callbacka вызову функцию Javascript
эта функция отработает нормально ?


Автор: Zinusya (не зарегистрирован), дата: 26 октября, 2009 - 18:50
#permalink

А зачем так извращаться? Если флеш невидим, то какова его функция в этой цепочке? Пример из жизни можна?


Автор: Гость (не зарегистрирован), дата: 13 февраля, 2010 - 17:00
#permalink

Пример из жизни - процессор звуковых сигналов для вэб месенджера.


Автор: Marabo (не зарегистрирован), дата: 19 ноября, 2009 - 14:44
#permalink

Автору статьи РЕСПЕКТ!!!


Автор: Максимка (не зарегистрирован), дата: 26 декабря, 2009 - 17:18
#permalink

Спасибо за статью!
Однако столкнулся с одной проблемой - использую ExternalInterface, скрипт работает только в том случае, если его прописать в первом кадре. Мне это не удобно, т.к. в первых кадрах расположен загрузчик, а данные загружаются из ХМЛя посже. Точнее, мне бы хотелось прописать экшн к кнопкам внутри мувиклипов (в первом кадре я еще не знаю их путей). Как можно это решить?

АС2, инклюд в первод кадре естественно.


Автор: KIL (не зарегистрирован), дата: 19 января, 2010 - 21:23
#permalink

Столкнулся с проблемой такого характера:
Хотел сделать чтоб при просматривании видео посетитель нажимал на проиграть ролик (на flv player-е) и при этом чтоб выскакивала реклама.
Помогите как это организовать?


Автор: Гноргий (не зарегистрирован), дата: 25 марта, 2010 - 19:21
#permalink

ребят подскажите пожалуйста, а как должен выглядеть еод для файла .swf


Автор: Вадим В. (не зарегистрирован), дата: 2 апреля, 2010 - 16:44
#permalink

Подскажите, пожалуйста:
Есть флеш объект, получив задание он отправляет его на сервер, после обработки задания сервер присылает флеш-объекту результат и тот выдаёт текст с результатом. Текст можно копировать и т.п.

Как можно перехватить текст результата от сервера (или прямо из флешобъекта) чтобы оперировать им.


Автор: Lob1AV (не зарегистрирован), дата: 20 апреля, 2010 - 13:44
#permalink

Извиняюсь за нубский вопрос, но как мне остановить/проиграть flash'ку с помощью javascript?


Автор: Lob1AV (не зарегистрирован), дата: 20 апреля, 2010 - 18:58
#permalink

Вопрос снят.
Решение:
Воспризвести: document.getElementById(obj).Play();
Остановить: document.getElementById(obj).StopPlay();
где obj - это id контейнера, при использовании динамеческого swfobject.
Источник: http://www.belonogov.ru/wrote/texts/fscommander/


Автор: Гость (не зарегистрирован), дата: 7 мая, 2010 - 12:40
#permalink

Превосходно! Великолепно) Думал придется долго искать и думать, а решение быстро нашлось, спасибо за статью)


Автор: Гость (не зарегистрирован), дата: 24 августа, 2010 - 13:17
#permalink

афтор молодца!!! зачотец!!!


Автор: Гость (не зарегистрирован), дата: 24 августа, 2010 - 16:40
#permalink

в 10 флеше юзаю экстернал интерфейс
багов не вижу пока. наверно в 10 уже исправлено в отличие от 8 про который афтор говорит


Автор: slagor (не зарегистрирован), дата: 13 сентября, 2010 - 01:31
#permalink

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


Автор: estoesyo, дата: 13 сентября, 2010 - 18:59
#permalink

Так ты в самом swf переадресацию сделай по окончании ролика.


Автор: slagor (не зарегистрирован), дата: 14 сентября, 2010 - 18:17
#permalink

Сложность состоит в том, что это не мой ролик.. и в самом ролике я изменить ничего не могу... можно как-то узнать с помощью джаваскрипта какие объекты находятся внутри ролика(под-ролики), ихние названия?? или определить что с роликом не происходит никаких изменений...?? или может есть еще какие-то идеи...

код самого ролика выглядит пока:
<object width="480" height="385" id="movie">
<param name="movie" value="http://www.youtube.com/v/ZTq3pi5Vd2Q?fs=1&hl=ru_RU"></param>
<param name="allowFullScreen" value="true"></param>
<param name="allowscriptaccess" value="always"></param>
<embed swLiveConnect=true id="movie" name="movie" src="http://www.youtube.com/v/ZTq3pi5Vd2Q?fs=1&hl=ru_RU" type="application/x-shockwave-flash"
allowscriptaccess="always" allowfullscreen="true" width="480" height="385">
</embed>
</object>

идея, в том что-бы после окончания ролика... загрузилась следующая страница... на которой ролик начал свое воспроизведение...


Автор: Владимир____ (не зарегистрирован), дата: 22 сентября, 2010 - 15:26
#permalink

Все прекрасно работает и под мак и под винду, вот тому доказательство: http://noregret.org/tutor/navigation/test/setvariable.html

Переписал ваш код на более универсальный и кросбраузерный:

function FlashSetVariable(FlashId, Variable, Value) {
			try {
				var app = navigator.appName.toLowerCase();
				var nav = navigator.userAgent.toLowerCase();
				var CheckBrowser = (app.indexOf('microsoft') != -1 || nav.indexOf('microsoft') != -1);
				var opera = Boolean(window['opera']);
				var MSIE = CheckBrowser && !opera;
				var Flash = MSIE ? window[FlashId] : document[FlashId];
				if(Flash.SetVariable(Variable, Value)) { return true; } else { return false; }
			} catch(e) {
				return false;
			}
		}

Спасибо этому сайту


Автор: ~online~, дата: 28 октября, 2010 - 05:28
#permalink

из верхнего js поля во flash поле значения не передавались у меня.


Автор: Гость (не зарегистрирован), дата: 22 ноября, 2010 - 02:24
#permalink

У меня трабл, когда пытаюсь вызывать AS метод через ExternalInterface.

Когда я вызываю document.swfMovie.funcName(...), у меня выскакивает исключение "Error calling method on NPObject!". Порылся в сети - не нашел решения. Говорят только что на удаленном сервере все начинает работать. Попробовал залить - тоже самое. Причем та флешка что вы тут дали в пример - принимает все замечательно. В чем же может быть проблема? Помогите плиз..


Автор: blacky (не зарегистрирован), дата: 6 декабря, 2010 - 01:36
#permalink

Есть ли возможность в чужой флэш игре получить доступ к переменным или даже вызывать методы ?


Автор: Гость (не зарегистрирован), дата: 14 декабря, 2011 - 16:46
#permalink

- при таком расскладе нельзя...


Автор: Jeer, дата: 26 апреля, 2012 - 16:09
#permalink

С чего это, вдруг, "нельзя"?!
Для того, чтобы использовать чужой флеш, тебе требуется после загрузки клиента вставить свои яваскриптовые функции у себя на клиенте. Затем получить этот ролик, и можно оперировать переменными флеша с помощью GetVariable, SetVariable из яваскрипта.
Имена переменных смотрятся в любом флеш-дебаггере.
Problem?


Автор: Гость (не зарегистрирован), дата: 7 декабря, 2010 - 00:09
#permalink

Всё замечательно работает.
Спасибо автору!
За исключением пустяка. Любая попытка внедрения AC_RunActiveContent приводит к тому, что мост перестаёт работать. Так что приходится лишний раз кликать по флэшке для активации.
Может быть, есть решение?


Автор: iAlexS (не зарегистрирован), дата: 11 февраля, 2011 - 04:13
#permalink

Как с помощью JS изменить значение (или установить если его нет) quality всех флешек на странице ?


Автор: Halfi, дата: 3 апреля, 2011 - 20:34
#permalink

Для работы в ie 9 надо поправить функцию:

function getMovie() {
	var M$ =  document["audioPlayer"]
	return (M$ ? document : window)["audioPlayer"]
}

Это связано с тем, что в 9 версии window возвратит 2 объекта и ембед и обджект. http://msdn.microsoft.com/en-us/library/gg622942%28v=VS.85%29.aspx


Автор: Гость (не зарегистрирован), дата: 17 апреля, 2012 - 14:07
#permalink
function getMovie() {
	return document["audioPlayer"] || window["audioPlayer"]
}

Фич-детекшен всегда лучше, чем проверка браузера.


Автор: Гость (не зарегистрирован), дата: 24 апреля, 2011 - 22:39
#permalink

Долго муччался и не мог понять почему ИЕ не хочет работать с ExternalInterface.call - писал объект null, нашел в инете простое решние "realised"

classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" т.е. добавил id

Автор: Гость (не зарегистрирован), дата: 16 июля, 2011 - 11:45
#permalink

Я вообще-то чайник, возможно поэтому не понял из прочитанного, как решить такую задачу.
Есть swf-файл. Он содержит собственное меню, кнопок на 10. Нужно вынести это меню в JS. Страницу с меню я сделал, swf в нее вставил. Сейчас он запускается при загрузке страницы. Не пойму как с помощью ссылок html-ного меню передавать команды в swf. Как задать эти 10 переменных в JS и привязать каждую из них к конкретной к html-кнопке?


Автор: vflash, дата: 10 августа, 2011 - 18:31
#permalink

так для сведение
если флешка была создана (createElement) как embed то в IE9-10 будут проблемы с ExternalInterface.addCallback . эта бага скорее всего во флеше.


Автор: ProjectSoft (не зарегистрирован), дата: 27 ноября, 2011 - 23:03
#permalink

vflash, данную ошибку легко избежать, да и вообще так нужно делать.
Работу с ExternalInterface надо начинать после того, как ролик загрузился. Т. е. добавить соответствующие слушатели.


Автор: all87, дата: 18 января, 2012 - 21:52
#permalink

возможно кто знает решение, уже долбаюсь не первый день.. Есть swf, подключая который можно управлять сервером через методы по типу SwfName.send() SwfName.connect() etc
во всех нормальных браузерах работает на ура, IE как всегда не может без херни, он видит SwfName, более того вызывает FlashLoaded() индикатор что можно коннектиться, но не видит ни SwfName.send ни SwfName.connect, в чем может быть проблема, подскажите пожалуйста! флеш не моя стихия, сервер обычно не влияет на клиент, но может ли быть проблема в самой флеше?? или в каком направлении искать?

<object id="PCBridge" width="5" height="5">
<param name="src" value="/system/modules/SocketDaemon/html/bridge/PCBridge.swf"/>
<param name="allowScriptAccess" value="sameDomain"/>
<embed name="PCBridge" src="/system/modules/SocketDaemon/html/bridge/PCBridge.swf" allowscriptaccess="sameDomain" width="5" height="5"/>
</object>


Автор: Гость (не зарегистрирован), дата: 9 февраля, 2012 - 14:16
#permalink

подскажите, можно ли скачать видео с этого сайта напрямую, без просмотра его в он-лайн? Если да, то как это сделать?
https://secure.cbtnuggets.com/it-training-videos/series/cisco-ccent-icnd...


Автор: v001 (не зарегистрирован), дата: 11 февраля, 2012 - 19:02
#permalink

Есть swf-файл. Он содержит собственное меню, кнопок на 10. Нужно вынести это меню в JS. Страницу с меню я сделал, swf в нее вставил. Сейчас он запускается при загрузке страницы. Не пойму как с помощью ссылок html-ного меню передавать команды в swf. Как задать эти 10 переменных в JS и привязать каждую из них к конкретной к html-кнопке?

Тоже интересует этот вопрос. Пожалуйста, ответе кто знает.


Автор: Гость (не зарегистрирован), дата: 9 апреля, 2012 - 15:20
#permalink

У меня из-под хрома пишет: Uncaught TypeError: Object # has no method 'SetVariable' . Соответственно, ничего не работает, данные не передаются. В то же время под фаерфокс и оперой всё гладко... В чём может быть ошибка?


Автор: Илья Щербаков (не зарегистрирован), дата: 26 июля, 2012 - 16:19
#permalink

Добрый день.

Коллеги, подскажите в каком направлении копать по следующей задаче.

Если сайт на котором расположены музыкальные треки. На одной странице проигрывается только один трек, это логично.

Задача: пользователь открыл несколько вкладок. На одной из них играет музыка. На другой вкладке пользователь хочет прослушать другой трэк. Как остановить проигрывание музыки в другой вкладке? ВКонтакт это как-то делает, что очень удобно.

Спасибо


Автор: brood (не зарегистрирован), дата: 14 мая, 2013 - 18:14
#permalink

Нужна очень ваша помощь, я сам новичок в javascript, у меня вот какая проблема я хочу сделать проверку на браузер, у меня проста на сайт стоит флэш интро но как мы знаем на планшетах и телеыонов нету флэша.... я по гуглил на нашел что можна сделать проверку....почитав немного java коечто написал но не знаю как законить....Короче идея в том что если в браузере есть флэш то выводится анимация, если нет то index.php!!! Help please!!!

function checkFlash() {
var flashinstalled = false;
if (navigator.plugins) {
if (navigator.plugins["Shockwave Flash"]) {
flashinstalled = true;
}
else if (navigator.plugins["Shockwave Flash 2.0"]) {
flashinstalled = true;
}
}
else if (navigator.mimeTypes) {
var x = navigator.mimeTypes['application/x-shockwave-flash'];
if (x && x.enabledPlugin) {
flashinstalled = true;
}
}
else {
flashinstalled = true;
}
return flashinstalled;
}

if (checkFlash()) {
//Если да то выводится интро
} else {
// Флэща нету, переадресация на index.php/ru
}


Автор: Гость (не зарегистрирован), дата: 12 августа, 2013 - 15:47
#permalink

Кредитный портал Dengi-Vdolg.Com - это деньги взаймы быстро


Автор: Гость (не зарегистрирован), дата: 2 мая, 2014 - 02:17
#permalink

в flash при ие последнем ничего не шлет =(


Автор: Гость (не зарегистрирован), дата: 22 сентября, 2014 - 22:53
#permalink

Вроде бы разобрался с SetVariable, ролик начал слушаться команд. Но - только в IE. В FF появляется ошибка "Error calling method on NPObject", и я не понимаю ее смысла. Это что, Лиса "не знает" такого метода как SetVariable, что ли?


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
9 + 2 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Реклама
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum