Проблема внешнего интерфейса Flash с Firefox - PullRequest
1 голос
/ 12 мая 2009

Мне трудно заставить ExternalInterface работать на Firefox. Я пытаюсь вызвать функцию AS3 из JavaScript. SWF настроен с правильными обратными вызовами и работает в IE.

Я использую AC_RunActiveContent.js для встраивания swf в мою страницу. Тем не менее, я изменил его, чтобы добавить идентификатор в теги Object / Embed. Ниже приведены теги object и embed, сгенерированные для IE и Firefox соответственно.

    <object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="400" height="400" align="middle" id="jpeg_encoder2" name="jpeg_encoder3" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" >
    <param name="movie" value="/jpeg_encoder/jpeg_encoder3.swf" /> 
    <param name="quality" value="high" /> 
    <param name="play" value="true" /> 
    <param name="loop" value="true" /> 
    <param name="scale" value="showall" /> 
    <param name="wmode" value="window" /> 
    <param name="devicefont" value="false" /> 
    <param name="bgcolor" value="#ffffff" /> 
    <param name="menu" value="false" /> 
    <param name="allowFullScreen" value="false" /> 
    <param name="allowScriptAccess" value="always" /> 
</object>


<embed 
    width="400" 
    height="400" 
    src="/jpeg_encoder/jpeg_encoder3.swf" 
    quality="high" 
    pluginspage="http://www.macromedia.com/go/getflashplayer" 
    align="middle" 
    play="true" 
    loop="true" 
    scale="showall" 
    wmode="window" 
    devicefont="false" 
    id="jpeg_encoder2" 
    bgcolor="#ffffff" 
    name="jpeg_encoder3" 
    menu="false" 
    allowFullScreen="false" 
    allowScriptAccess="always" 
    type="application/x-shockwave-flash" > 
</embed>

Я вызываю функцию вот так ...

<script>
try {
    document.getElementById('jpeg_encoder2').processImage(z);
} catch (e) { alert(e.message); }
</script>

В Firefox я получаю сообщение об ошибке "document.getElementById("jpeg_encoder2").processImage is not a function"

Есть идеи?

Ответы [ 7 ]

2 голосов
/ 25 мая 2009

Хм, вы выставили свою функцию actionscript в Javascript с помощью addCallback?

Документация Adobe по addCallback

1 голос
/ 15 марта 2011

Посмотреть это сообщение .

Вы хотите, чтобы JS-функция, более похожая на эту, получала объект Flash (а не getElemById):

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

И не вызывайте эту функцию, пока документ не загружен.

1 голос
/ 18 января 2011

Ниже приведен пример того, как Flash-ролик размещается на html-странице. Этот фильм очень простой фильм со стоп-действием в начале. Фильм показан ниже в разделе «Выполнение теста». Этот конкретный HTML-код был автоматически сгенерирован командой Publish FlashMX. Обратите внимание, что файл Flash-фильма - simplemovie.swf; и идентификатор и имя были автоматически назначены Flash в соответствии с именем файла фильма (за исключением расширения .swf). На самом деле имя и идентификатор могут быть любыми (но не используйте экзотерические имена, особенно не начинаются с цифры), если они не используются никаким другим элементом на той же странице.

`codebase="http://download.macromedia.com/pub/shockwave/cabs/flash`/swflash.cab#version=6,0,0,0" `WIDTH =" 150 "HEIGHT =" 75 "id =" simplemovie "ALIGN =" "> ` quality=medium `swliveconnect =" true " `bgcolor = # FFFFFF WIDTH =" 150 "HEIGHT =" 75 " `name =" simplemovie " `ALIGN =" " `TYPE = "применение / х-ударноволновая-вспышка" `PLUGINSPAGE =" http://www.macromedia.com/go/getflashplayer">

во флэш-файле есть функция воспроизведения, следующая функция будет вызывать эту функцию:

function testEval(stringToEval)
{
  var movie=eval(stringToEval);
  if (movie)
  {
    if (movie.PercentLoaded())
    {
      if (movie.PercentLoaded()==100)
      {
        movie.Play();
      }
      else
      {
        alert("movie is still loading, try again soon");
      }
    }
    else
    {
      alert("movie object found-but unable to send command"); 
    }
  }
  else
  {
    alert("movie object not found");
  }
}
0 голосов
/ 25 апреля 2011

Если вместо того, чтобы использовать AC_RunActiveContent.js для встраивания вашего флэш-фильма, вы используете swfobject, существует простой способ сделать это.

<head>
 <script type="text/javascript" src="swfobject.js"></script>

 <script type="text/javascript">
 try {
      swfobject.getObjectById('jpeg_encoder2').processImage(z); 
      } catch (e) { alert(e.message); }
 </script>
</head>

Если вы не используете swfObject, вы можете просто скопировать и вставить swfobject.getObjectById прямо в ваш код:

<script type="text/javascript">

function getObjectById(objectIdStr) {
        var r = null;
        var o = getElementById(objectIdStr);
        if (o && o.nodeName == "OBJECT") {
            if (typeof o.SetVariable != UNDEF) {
                r = o;
            }
            else {
                var n = o.getElementsByTagName(OBJECT)[0];
                if (n) {
                    r = n;
                }
            }
        }
        return r;

getObjectById('jpeg_encoder2').processImage(z); //call your method 
</script>
0 голосов
/ 25 августа 2010

Попробуйте эти две вещи:

Сначала попробуйте вызвать функцию из Javascript следующим образом:

var swf;
if(navigator.appName.indexOf("Microsoft") != -1) {
    swf = window["jpeg_encoder2"];
} else {
    swf = document["jpeg_encoder2"];
}
if(typeof(swf) == "undefined") swf = document.getElementById("jpeg_encoder2");

swf.processImage(z);

Во-вторых, я обнаружил, что вызовы ExternalInterface в Firefox, похоже, работают только с тегами вставки, а не с тегами объектов. Посмотрите, сможете ли вы заставить его работать, если вы просто используете тег для встраивания. (В настоящий момент мне неясно, будет ли опубликованная вами комбинация HTML / Javascript иметь доступ к объекту или элементу embed.)

0 голосов
/ 06 мая 2010

Виден ли ваш swf (на странице), прежде чем вы попытаетесь вызвать его? Если нет, прочитайте это: swf-not-initializing-before-visible

0 голосов
/ 13 мая 2009

Попробуйте использовать один и тот же идентификатор в тегах object и embed . Я помню, один браузер использует один тег, а другой - другой ... не знаю, какой из них какой. У меня была такая же проблема некоторое время назад.

Я справился, изменив Пример кода , который поставляется со вспышкой. Убедитесь, что он работает, затем удалите его и адаптируйте для моего использования.

В примере обратите внимание, что тег object для тега id , установленный в "ExternalInterfaceExample", тогда тег embed имеет имя параметр установлен в "ExternalInterfaceExample", а также. Я думаю, что это может быть ваша подсказка.

Удачи!

...