flash: ExternalInterface работает с тегом вставки, но не с тегом объекта - PullRequest
5 голосов
/ 19 сентября 2011

«Современный» обновленный способ внедрения флеш-объекта, согласно Adobe:

        <object id="theFlash" name="theFlash" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" 
         width="400" height="225" align="middle">
            <param name="movie" value="theflashfile.swf" />
            <param name="allowScriptAccess" value="always" />
            <!--[if !IE]>-->
            <object type="application/x-shockwave-flash"
             data="getStreamFrame.swf" width="400" height="225">
            <param name="allowScriptAccess" value="always" />
            <!--<![endif]-->
            <a href="http://www.adobe.com/go/getflash">
                <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
            </a>
            <!--[if !IE]>-->
            </object>
            <!--<![endif]-->
        </object>

При попытке вызвать функцию AS3 в SWF из Javascript:

     var flashObj = document.getElementById('theFlash');
     flashObj.someASFunction();

(и на стороне AS:)

     import flash.external.*;
     function someASFunction() {
        //show some text
     }
     ExternalInterface.addCallback("someASFunction", someASFunction);

Этот не работает в Firefox и Chrome.Вспышка работает и загружается.flashObj получает ссылку на объект, но someASFunction не определена и не вызывается.

Если я заменю тег объекта на тег embed:

   <embed id="theFlash" name="theFlash" height="225" width="400" align="middle" 
    type="application/x-shockwave-flash" allowscriptaccess="always"
    src="theflashfile.swf" />

Тогда он работает в Firefox и Chrome (функция AS вызывается и работает правильно) - (хотя она не работает в IE).

Почему это не работает с тегом объекта?Насколько «безопасно» использовать тег embed вместо тега object?Разве это не устарело?

Обратите внимание, что это определенно не проблема синхронизации - если я вызываю функцию AS из JS из функции onclick - тогда результаты совпадают.

Ответы [ 4 ]

4 голосов
/ 10 ноября 2012

При использовании рекомендованного метода Adobe мне также не удалось настроить таргетинг на flashmovie в FF и Chrome. В итоге я использовал следующий код, и ExternalInterface прекрасно работает во всех браузерах

    <div id="flashContent">

        <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="619" height="99" id="myFlashMovie" align="middle">
            <param name="movie" value="myFlashMovie.swf" />
            <param name="quality" value="high" />
            <param name="bgcolor" value="#f2f2f2" />
            <param name="allowScriptAccess" value="sameDomain" />
            <!--[if !IE]>-->
            <embed src="myFlashMovie.swf" quality="high" bgcolor="#f2f2f2"
             width="619" height="99" name="myFlashMovie" align="middle"
             play="true" loop="true" quality="high" allowScriptAccess="sameDomain"
             type="application/x-shockwave-flash"
             pluginspage="http://www.macromedia.com/go/getflashplayer">
        </embed>
            <!--<![endif]-->
        </object>

Для таргетинга на флэш-ролик я использую этот java-скрипт

        function sendDataToFlash(data) {

            getFlashMovie("myFlashMovie").myCallbackInFlash(data);

        }

        function getFlashMovie(movieName) {
            var isIE = navigator.appName.indexOf("Microsoft") != -1;
            if(isIE) return window[movieName];
            else return document[movieName];

        }
1 голос
/ 19 сентября 2011

для статического встраивания (что мне нравится больше), я использую этот код (этот для моего невидимого mp3-плеера):

<object style="position:fixed" id="1pixPlayer" width="1" height="1" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000">
    <param value="transparent" name="wmode">
    <param value="1pxMp3.swf" name="movie">
    <param value="always" name="allowScriptAccess">
<embed name="1pixPlayer" width="1" height="1" type="application/x-shockwave-flash" wmode="transparent" allowscriptaccess="always" src="1pxMp3.swf"></object>
0 голосов
/ 16 апреля 2014

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

        <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100%" height="100%" id="launcher"
                align="middle">
            <param name="movie" value="/flex-frontend/launcher.swf?version=1.3"/>
            <param name="flashvars"
                   value="sessionId=${session.id}"/>
            <param name="wmode" value="direct"/>
            <param name="allowFullScreen" value="true"/>
            <param name="bgcolor" value="#000000"/>
            <!--[if !IE]>-->
            <object type="application/x-shockwave-flash" id="launcher1" data="/flex-frontend/launcher.swf?version=1.3"
                    width="100%" height="100%">
                <param name="flashvars"
                       value="sessionId=${session.id}"/>
                <param name="wmode" value="direct"/>
                <param name="allowFullScreen" value="true"/>
                <param name="bgcolor" value="#000000"/>
                <!--<![endif]-->
                <a href="http://www.adobe.com/go/getflash">
                    Flash player version not less than 10.3 is required!
                </a>
                <!--[if !IE]>-->
            </object>
            <!--<![endif]-->
        </object>

Затем из javascript:

// This doesn't work
// var flashObj = $("#launcher");
// But this does
var flashObj = $("#launcher1");
var screenshotData = flashObj.get(0).exportScreenshot();

Работадля Chrome и FF.

0 голосов
/ 21 сентября 2011

объектный элемент является элементом управления ActiveX, он работает только в IE.

стандартные браузеры w3c вместо этого используют тег embed.

обычно вы должны создать флэш-память следующим образом:

    var fla, box = document.createElement("div");

    box.innerHTML = window.ActiveXObject?
        "<object id='ID_XXX' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'><param name='movie' value='XXX.swf'></object>":
        "<embed src='XXX.swf'></embed>";

    fla = box.firstChild;
    document.body.appendChild(fla);
...