Изменение произвольных флэш-объектов wmode на прозрачные

Мне нужно изменить wmode произвольных флэш-объектов на прозрачность из внешнего js файла, чтобы убедиться, что они не скрывают меню без использования JQuery или подобных библиотек.

В FF я использую getElementsByTagName("embed") и устанавливаю атрибут. Кажется, что он работает хорошо.

В частности, у меня возникают проблемы с object, установленными библиотекой swfObject В IE7.

swfObject создает следующий код в iE7:

<OBJECT id=mymovie height=400 width=134 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000>
        <PARAM NAME="_cx" VALUE="3545">
        <PARAM NAME="_cy" VALUE="10583">
        <PARAM NAME="FlashVars" VALUE="">
        <PARAM NAME="Movie" VALUE="imgs/site/tower.swf">
        <PARAM NAME="Src" VALUE="imgs/site/tower.swf">
        <PARAM NAME="WMode" VALUE="Window">
        <PARAM NAME="Play" VALUE="0">
        <PARAM NAME="Loop" VALUE="-1">
        <PARAM NAME="Quality" VALUE="High">
        <PARAM NAME="SAlign" VALUE="">
        <PARAM NAME="Menu" VALUE="-1">
        <PARAM NAME="Base" VALUE="">
        <PARAM NAME="AllowScriptAccess" VALUE="">
        <PARAM NAME="Scale" VALUE="ShowAll">
        <PARAM NAME="DeviceFont" VALUE="0">
        <PARAM NAME="EmbedMovie" VALUE="0">
        <PARAM NAME="BGColor" VALUE="FFFFFF">
        <PARAM NAME="SWRemote" VALUE="">
        <PARAM NAME="MovieData" VALUE="">
        <PARAM NAME="SeamlessTabbing" VALUE="1">
        <PARAM NAME="Profile" VALUE="0">
        <PARAM NAME="ProfileAddress" VALUE="">
        <PARAM NAME="ProfilePort" VALUE="0">
        <PARAM NAME="AllowNetworking" VALUE="all">
        <PARAM NAME="AllowFullScreen" VALUE="false">
</OBJECT>

Я старался всячески настраивать wmode на transparent и делать flash не спрятать плавающие объекты без успеха, включая, но не ограничиваясь:

  • Найдите object и измените его PARAM wmode на transparent.
  • Установить атрибут object (wmode=transparent)
  • Вызов функции object SetValue

Нет, похоже, работает. Хотя wmode, похоже, изменяет Flash, все еще скрывает другие объекты с высоким значением z-index. Что мне здесь не хватает?

Ответ 1

Мне удался этот маленький трюк:

$("embed").attr("wmode", "opaque").wrap('<div>');

Он эффективно перерисовывает Flash-объект, работал у меня.

Ответ 2

Решение Cirday в целом является правильным. Здесь версия non-jQuery, работающая в IE, FF и Chrome:

var embed = document.getElementsByTagName('embed');
for(var i = 0; i < embed.length; i++){
    embed[i].setAttribute('wmode','opaque');
}
// FF does a "live" array when working directly with elements,
// so "els" changes as we add/remove elements; to avoid problems
// with indexing, copy to a temporary array
var els = document.getElementsByTagName('object');
var obj = [];
for(var i = 0; i < els.length; i++){
   obj[i] = els[i];
}
for(var i = 0; i < obj.length; i++){
    var param = document.createElement('param');
    param.setAttribute('name','wmode');
    param.setAttribute('value','opaque');
    obj[i].appendChild(param);

    var wrapper = document.createElement('div');
    obj[i].parentNode.appendChild(wrapper);

    if(obj[i].outerHTML){
        // IE
        var html = obj[i].outerHTML;
        obj[i].parentNode.removeChild(obj[i]);
        wrapper.innerHTML = html;
    }else{
        // ff/chrome
        obj[i].parentNode.removeChild(obj[i]);
        wrapper.appendChild(obj[i]);
    }
}

Ответ 3

Когда вы используете SWFObject для включения вспышки, должен быть параметр в методе embedSWF под названием "params". Вы передаете ему объект, как это:

swfobject.embedSwf(blah,blah,blah, { wmode:'transparent'});

подробнее здесь

Ответ 4

Неверно, что флэш-ролик нужно переиздавать, чтобы изменить параметр wmode - его миф:

http://www.communitymx.com/content/article.cfm?cid=E5141

У меня такая же проблема с меню, и мне нужен код, чтобы добавить параметр wmode к любому объекту Flash, который вызывается javascript.

Я думаю, что исходное сообщение относится к этому, но я не уверен, с чего начать и нужно больше информации.

Ответ 5

Я почти на 100% уверен, что вы не можете изменить параметр wmode во время выполнения. Я имею в виду, вы технически можете, но не окажете никакого эффекта. Я действительно удивлен, что у вас были успешные попытки. Какую версию и браузер для Flash-плееров вы успешно выполнили?

Извините, я не могу найти официальную ссылку, чтобы доказать свою точку зрения, но я оставлю вам эту очень интересную ссылку о том, как работает wmode (обновляется до игрока 10):

Что означает ускорение GPU?

Приветствия,

Хуан