Почему я не могу заставить Javascript разговаривать с ActionScript

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

<div class="musicplayer_playpause">
            <script type="text/javascript">
            AC_FL_RunContent( 'codebase','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0','width','65','height','68','src','player','quality','high','pluginspage','http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash','wmode','transparent','id','flashobject','movie','player','flashvars','id=<?=$cur_songid;?>&type=<?=$_GET["type"];?>&csid=<?=$cur_songid;?>&l=<?=$Arrcntt+1;?>"' ); //end AC code
            </script><noscript><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" id="flashobject" width="65" height="68">
              <param name="movie" value="player.swf" allowscriptaccess="always"/>
              <param name="quality" value="high" />
              <param name="wmode" value="transparent" />
        <param name="id" value="flashobject" />
        <param name="swliveconnect" value="true" />
              <embed src="player.swf" name="flashobject" width="65" height="68" quality="high" allowscriptaccess="always" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" wmode="transparent" swliveconnect="true" ></embed>
          </object>
          </noscript></div>

Вот функция Javascript, которую я поместил в раздел:

<script type="text/javascript">
function Pause() {
var flash =  document.getElementById('flashobject');
flash.PlayPause;
}
</script>

И, наконец, вот кнопка, которую я использую:

<form>
<input type="button" value="Play" name="Play" onClick="Pause();"> 
</form>

Когда я нажимаю кнопку, в консоли ошибок Firefox появляется сообщение «Flash is null». Что я делаю не так?


person John D    schedule 09.02.2010    source источник
comment
В вашем элементе javascript отсутствует кавычка. Дайте мне знать, если это исправит, чтобы я мог опубликовать его в качестве ответа.   -  person Anthony    schedule 09.02.2010
comment
Спасибо, но теперь я получаю Flash is Null   -  person John D    schedule 09.02.2010


Ответы (4)


Я не думаю, что это прямое решение вашей проблемы, но по опыту знаю, что использование

var flash =  document.getElementById('flashobject');
flash.PlayPause;

не будет вести себя одинаково во всех популярных браузерах. вы можете попробовать использовать следующую функцию для возврата объекта:

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

Однако, если вы используете jQuery, подойдет следующее:

$("#flashobject")[0].PlayPause();

изменить: я нашел более обновленную версию функции thisMovie. Я все же рекомендую способ jQuery :)

function getFlashMovieObject(movieName){
  if(document.embeds[movieName])
    return document.embeds[movieName];
  if(window.document[movieName])
    return window.document[movieName];
  if(window[movieName])
    return window[movieName];
  if(document[movieName])
    return document[movieName];
  return null;
}
person Jasper De Bruijn    schedule 09.02.2010
comment
Я возвращаюсь, что этот фильм ('flashobject') не определен при нажатии кнопки. - person John D; 09.02.2010

Тег скрипта, содержащий Pause, имеет неправильный формат. Добавьте завершающую кавычку к атрибуту type.

Кроме того, AC_FL_RunContent не определяет идентификатор фильма. Добавьте к нему еще 4 параметра - id, flashobject, name, flashobject.

AC_FL_RunContent описан в техническом примечании Adobe http://kb2.adobe.com/cps/127/tn_12701.html, в котором говорится:

  • id (атрибут для объекта, только объект)
    Идентификатор фильма. Идентифицирует Flash-фильм в среде хоста (например, в веб-браузере), чтобы на него можно было ссылаться с помощью языка сценариев.
  • имя (только встраивание) Название фильма. Идентифицирует Flash-фильм в среде хоста (обычно в веб-браузере), чтобы на него можно было ссылаться с помощью языка сценариев, такого как JavaScript или VBScript.
person Lachlan Roche    schedule 09.02.2010
comment
Спасибо! Но теперь у меня флэш-ноль. Мне действительно нужна помощь в этом. - person John D; 09.02.2010
comment
Добавлены теги в AC_FL_Runcontent, но я все еще получаю flash is null - person John D; 09.02.2010
comment
Внесены все эти изменения (см. Правки выше), но вспышка по-прежнему равна нулю. - person John D; 09.02.2010
comment
Параметры, которые вы предлагаете добавить в AC_FL_RunContent, на самом деле относятся к объекту и вставке соответственно. Они у меня уже были там. Я все равно добавил их в AC_FL_RunContent, но все равно получаю ту же ошибку. - person John D; 09.02.2010

найдите это: <param name="movie" value="player.swf" allowscriptaccess="always"/> заменить на

 <param name="movie" value="player.swf" />
   <param name="allowScriptAccess" value="always" />

Я бы все равно использовал функцию Джаспера

person michael    schedule 09.02.2010

У Jasper есть правильный метод JavaScript, но вам также необходимо добавьте обратные вызовы для ваших JS-функций в ActionScript, чтобы AS знала, что им нужно прислушиваться.

Код AS:

import flash.external.ExternalInterface;
ExternalInterface.addCallback("PlayPause", playPauseMovie);
...
function playPauseMovie():void {
   //code goes here
}
person Justin Putney    schedule 12.03.2011