Вход

Просмотр полной версии : Динамическая смена атрибута


BleSSeD
21.05.2010, 22:26
Я вставляю флешку на страницу с помощью SWFObject. Вопрос такой: можно ли потом, уже после вставки поменять атрибут wmode. Или хотя бы бекграунд ?

mooncar
22.05.2010, 02:40
Меняйте. Можете с помощью JS, например.

BleSSeD
22.05.2010, 20:54
А как это сделать? Разве флеш реагирует на JS?
$('embed').attr('wmode', 'opaque');
Так не работает.

iNils
22.05.2010, 21:07
Не будет работать.

mooncar
22.05.2010, 21:08
Вам же к не флешке нужно обращаться с помощью JS.
Просто делайте перепубликацию - меняйте или wmode или bgcolor.

Если хотите, то и к флешке можно легко обратиться с помощью класса ExternalInterface, который есть и в AS2 и в AS3. Откройте хелп и найдите пример для класса ExternalInterface.addCallback. Что угодно можно изменить в ней на "ходу".

BleSSeD
22.05.2010, 23:35
Ну так wmode задаеться с помощью джава скрипта. А как прямо через АС3 задать wmode ?

iNils
23.05.2010, 00:08
Никак.

mooncar
23.05.2010, 00:10
Можно использовать класс ExternalInterface. Вызываете из флешки с его помощью JS-функцию и перепубликовываете как хотите.

Вот вам близкий пример на AS2. Меняем размеры блока, в котором опубликована флешка:
import flash.external.*;
var blockWidth:String = '500px';
var blockHeight:String = '100px';
var javaScriptFunction:String = 'function setSize() { var flash = document.getElementById("flash"); flash.style.width = "' + blockWidth +'"; flash.style.height = "' + blockHeight +'"; }';
ExternalInterface.call (javaScriptFunction); //в нужный момент вызываем
В данном примере блок <div> с флешкой должен иметь id="flash"
Просто напишите функцию, которая будет перепубликовывать флешку и вызывайте ее из флеша с помощью ExternalInterface.call

BleSSeD
23.05.2010, 00:54
Нет, мне нужно джава скриптом изменить атрибут флеша. Это не через действие флешки, а через действие пользователя на странице. Изменить wmode. насколько я понял это нужно джава скриптом передать в флешку команду, и сама флешка изменит свой wmode ?

mooncar
23.05.2010, 00:57
Вам в процессе выполнения флешки нужно? То есть "после вставки" == "в процессе выполнения" ?
Видимо без перепубликации никак.

насколько я понял это нужно джава скриптом передать в флешку команду, и сама флешка изменит свой wmode ?
Нет, не так.

Вообще:
ExternalInterface.call - вызывает JS-функцию на странице.
ExternalInterface.addCallback - вызывает со страницы функцию внутри флешки.

Я так понял, что вариант с изменяемой прозрачностью внутреннего фона флешки (когда она сама опубликована изначально прозрачной) - тоже подходящее решение, вот пример набросал:
http://21multihinge.ru/dyn/dyn.htm

Флешка публикуется изначально с wmode = 'transparent'.
Затем с помощью метода ExternalInterface.addCallback меняем прозрачность некого фона bg внутри флешки.

Если интересны подробности, то вот код AS2:
import flash.external.*;
var setBg:Boolean = ExternalInterface.addCallback('setBackground', null, setBackgroundMode);
function setBackgroundMode (modes:String) {
switch (modes) {
case 'non_bg':
bg._alpha = 0;
break ;
case 'with_bg':
bg._alpha = 100;
break ;
}

test.text = str + bg._alpha ;
}
var str:String = 'Прозрачность фона = ';

Основной код на странице:
<head>
.....
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
function setWmode(mode) {
var flash = document.getElementById("dynamic");
flash.setBackground(mode);
}
</script>
</head>

<body>
....
<div style="width:240px; height:400px">
<div id="dynamic">
....
<script type="text/javascript">
var pFlashvars = false;
var pParams= { menu: 'false', allowScriptAccess: 'always', allowFullScreen: 'false', quality: 'high', bgcolor: '#88909A', wmode: 'transparent' };
var pAttributes = false;
swfobject.embedSWF('dynattr.swf', 'dynamic', '240', '400', '8.0.0', 'expressInstall.swf', pFlashvars, pParams, pAttributes);
</script>
....
<input type="button" value="Отключить внутренний фон у флешки" onclick="setWmode('non_bg')" style="width:240px"/>
<input type="button" value="Включить внутренний фон у флешки" onclick="setWmode('with_bg')" style="width:240px"/>
....
</body>
</html>

BleSSeD
24.05.2010, 16:12
Уже был сделал и все работало в фф, но после теста в других браузерах получилось не очень хорошо.
Значит у меня на странице вставлена флешка. У нее нормальный wmode. Его я менять не могу, это точно. Также на странице при нажатии на некую ссылку выскакивает окошко, и весь экран затемняется (jquery dialog). И вот получается, что мне нужно чтобы эта флешка была под этим окошком. а она на нем. Значит мне нужно динамически сменить wmode чтобы окошко было сверху?

mooncar
28.05.2010, 03:26
Не трогайте wmode. Используйте z-индексы для блоков с флешкми и других блоков.
(Их даже можно менять динамически с помощью переприсвоения CSS-стилей, или изменения текущего стиля)

См. пример http://21rest.ru/ - выберите "Поиск". Подгружается другая флешка id="sbox", для ее родительского блока id="sb" z-индекс выше, чем у остальных. (Кстати, wmode у нее window, но это только оттого, что там кириллица нужна для ввода, а так можно было и opaque поставить)

Еще - http://www.21rest.ru/catalog/index.php?p=1 , щелкните по любой номерной картинке в "Ключевых особенностях" - поверх всей конструкции откроется доселе невидимый блок с флешкой, где фотка откроется крупнее и фон во весь экран. Для ее родительского блока id="fs" в CSS тоже выставлен высокий z-индекс. И для нее уже wmode: "transparent", иначе бы ничего не просвечивало под нею. К слову сказать, на этой странице под этим экраном остаются и несколько других флешек, которые присутствуют на странице.

BleSSeD
28.05.2010, 12:45
Ну если wmode: window то разве он на з-индекс реагирует?

mooncar
28.05.2010, 13:01
Да, не реагирует (соглашусь, что мой первый пример некорректен, флешка там останется видимой при любом z).
А не использовть wmode: window не получится? Opaque например использовать никак нельзя?

BleSSeD
01.06.2010, 16:30
Нет, не получиться. Ну ладно, я делая флешку вообще невидимой. через цсс. Когда выложим в инет проект, дам ссылку.

Добавлено через 22 часа 6 минут
http://shkolaonline.net/audio/BleSSeD/
Вот тут пример как я сделал. Когда выскакивает jquery dialog, флешки прятаются. Правда чтобы это посмотреть, надо зарегестрироваться