2016-11-30 10 views
1

Следующий код, встраивающий анимацию Flash в HTML-документ с использованием SWFObject, отображает только альтернативный контент. Зачем?swfobject.embedSWF не работает?

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Adding a Flash Movie</title> 
     <script type="text/javascript" 
       src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"> 
     </script> 
     <script type="text/javascript"> 
      swfobject.embedSWF("flash/bird.swf", "bird", "400", "300", "8.0.0"); 
     </script> 
    </head> 
    <body> 
     <div id="bird"> 
      <p>An animation of a bird taking a shower</p> 
     </div> 
    </body> 
</html> 

Chrome, IE и Firefox все показывают только An animation of a bird taking a shower.

Код a sample из книги HTML & CSS: design and build websites.

+0

поддержка флэш удаляется из многих последних версиях браузеров. Перед использованием проверьте совместимость браузера. –

+0

Поддержка Flash не удаляется из браузеров. Скорее, Flash теперь включен только после всплывающего окна «спросить активировать». К сожалению, swfobject не работает с этой более новой схемой. – Chris

+0

Flash достигнет своего конца жизни в 2020 году, @ Chris. До этого производители браузеров будут постепенно ограничивать использование Flash, пока они в конечном итоге полностью не откажутся от поддержки. См. Ссылку, которую я отредактировал в вашем ответе. – Palec

ответ

7

SWFObject 2.2 больше не работает должным образом. bug in SWFObject уже сообщалось о GitHub, но библиотека не поддерживается.

Новая политика «HTML по умолчанию», начинающаяся с Chrome 55, не инициализирует переменные, используемые SWFObject для определения того, установлена ​​ли Flash. В частности, navigator.mimeTypes больше не содержит application/x-shockwave-flash, если только Flash не включен пользователем. Другие браузеры имеют похожие проблемы, связанные с click-to-run activation scheme, представленными как часть Flash’es end of life.

На данный момент лучшим способом может быть использование <object> для встраивания Flash. Например:

<object type="application/x-shockwave-flash" data="app.swf"> 
    <param name='movie' value="app.swf"/> 
    <param name='bgcolor' value="#999999"/> 
    <param name='FlashVars' value="var1=Hello&var2=Goodbye" /> 
    <param name='allowscriptaccess' value="sameDomain"/> 
</object> 

Заметим, что (1) .swf указывается в двух местах (2) требуется только movie парам; другие параметры показаны здесь как пример того, что возможно.

3

Chrome с версии 55 не инициализирует переменные, которые swfobject должен определить, установлена ​​ли Flash. Вы можете применить примитивный патч к SWFObject JS, чтобы пропустить проверку hasPlayerVersion:

-  if (hasPlayerVersion(swfVersionStr)) { // create SWF 
+  try { // create SWF 
      var obj = createSWF(att, par, replaceElemIdStr); 
      if (att.id == replaceElemIdStr) { 
       setVisibility(replaceElemIdStr, true); 
      } 
      callbackObj.success = true; 
      callbackObj.ref = obj; 
-  } 
-  else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install 
-   att.data = xiSwfUrlStr; 
-   showExpressInstall(att, par, replaceElemIdStr, callbackFn); 
-   return; 
-  } 
-  else { // show alternative content 
+  } catch (e) { // show alternative content 
      setVisibility(replaceElemIdStr, true); 
     } 
+0

Можете также изменить 'hasPlayerVersion()', чтобы возвращать true все время? –

+0

Нет, потому что он не будет показывать replaceElemIdStr в старых браузерах – AndreyP