Rumah  >  Artikel  >  hujung hadapan web  >  Akses JS kepada kemahiran penggunaan fungsi SWF examples_javascript

Akses JS kepada kemahiran penggunaan fungsi SWF examples_javascript

WBOY
WBOYasal
2016-05-16 15:51:52949semak imbas

Contoh dalam artikel ini menerangkan penggunaan fungsi JS untuk mengakses SWF. Kongsikan dengan semua orang untuk rujukan anda. Analisis khusus adalah seperti berikut:

Terdapat banyak contoh Flash dan JS yang memanggil satu sama lain. Sudah tentu, ralat panggilan bukan ralat antara Flash dan JS Hari ini kami akan menyelesaikan sepenuhnya masalah ketidakserasian antara IE, FF dan Chrome .

Kami tahu bahawa dalam Flash, jika anda mengakses fungsi JS luaran, anda hanya perlu

Salin kod Kod adalah seperti berikut:
flash .external.ExternalInterface.call("Nama fungsi dalam JS");
Ayat ini sudah memadai

Jika anda mahu JS mengakses fungsi dalam Flash, anda perlu mendaftarkan fungsi panggil balik dengan addCallBack dan biarkan JS memanggilnya (contoh AS2)

import flash.external.*;
var methodName:String = "SetImgPath";
//JS需要调用的函数名字
var instance:Object = null;
var method:Function = extractstr;
//Flash中实际的函数名字,参数忽略,但是你调用的时候要记得有参数的要加上
var wasSuccessful:Boolean = ExternalInterface.addCallback(methodName, instance, method);
trace(wasSuccessful+"-callback")

Kita boleh trace kalau betul masa ni bermakna pendaftaran berjaya

OK, cuba di web di bawah:

<div style="margin-left:50px; margin-bottom:50px"><input type="text" id="mytxt" border="1" value="这是测试框,调用页面JS演示" style="width:200px"/></div>
  <div id="flashContent">
   <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="515" height="320" id="123" align="middle">
    <param name="movie" value="123.swf" />
    <param name="quality" value="high" />
    <param name="bgcolor" value="#000000" />
    <param name="play" value="true" />
    <param name="loop" value="true" />
    <param name="wmode" value="transparent" />
    <param name="scale" value="showall" />
    <param name="menu" value="true" />
    <param name="devicefont" value="false" />
    <param name="salign" value="" />
    <param name="allowScriptAccess" value="sameDomain" />
    <!--[if !IE]>-->
    <object type="application/x-shockwave-flash" data="123.swf" width="515" height="320"><!--下面针对非IE内核浏览器--> 
     <param name="movie" value="123.swf" />
     <param name="quality" value="high" />
     <param name="bgcolor" value="#000000" />
     <param name="play" value="true" />
     <param name="loop" value="true" />
     <param name="wmode" value="transparent" />
     <param name="scale" value="showall" />
     <param name="menu" value="true" />
     <param name="devicefont" value="false" />
     <param name="salign" value="" />
     <param name="allowScriptAccess" value="sameDomain" />
    <!--<![endif]-->
     <a href="upload/2011/1/201101281000491420.gif" alt="获得 Adobe Flash Player" />
     </a>
    <!--[if !IE]>-->
    </object>
    <!--<![endif]-->
   </object>
  </div>

OK, kami menambah butang pada Web untuk memanggil panggilan kilat ini: 54b6df0300e1751edde6b97a69a14a74

Uji:

Semuanya berfungsi dengan baik untuk IE6, 7, 8, 9

FF: Gagal

Chrome: Gagal

Punca kegagalan: SetImgPath bukan fungsi /tidak ditakrifkan)

Ini sangat pelik, kita boleh menggunakan amaran untuk mengeluarkan

Salin kod Kodnya adalah seperti berikut:
thisMovie ("123"): alert(thisMovie("123"));

Hasil output bukan Null, yang bermaksud Flash kami telah ditemui, tetapi mengapa FF dan Chrome tidak dapat sentiasa mencari fungsi itu?

Selepas menyemak imbas pelbagai forum, konsensus ialah addCallback mesti dimuatkan dengan flash sebelum pendaftaran boleh berjaya, mari tambah fungsi settimeout untuk menentukan sama ada pemuatan itu berjaya:

function flashcall(str){  
     try{   
  thisMovie("123").SetImgPath(str);//注意,123是上面的ID,而SetImgPath是我们Flash中的注册的回调函数
 }cache(e){
  settimeout("flashcall(str)",100 );
       }
}

Nah, kami menggunakan settimeout dan memanggilnya setiap 100 milisaat Jika ada pengecualian, kami akan terus memanggil sehingga berjaya!

Malangnya, ia tidak pernah berjaya dan program memasuki gelung yang tidak terhingga!

Selepas berunding dengan pelbagai maklumat, akhirnya saya jumpa sebabnya:

Pelayar dalam FF hanya mengenali teg benam, jadi jika anda menggunakan getElementById untuk mendapatkan denyar, anda perlu menandai benam dengan ID, jadi anda perlu menandai ID pada objek 🎜>

Adakah anda faham? Ternyata dalam FF dan Chrome, Flash mesti menggunakan benam untuk mengenal pasti IDnya, dan teg Objek tidak dapat mengenal pasti ID yang saya gunakan dijana secara automatik oleh Flash, dan semuanya adalah teg Objek , yang berbahaya Selepas menyahpepijat selama satu petang, saya menyedari bahawa masalahnya terletak di sini.

Sekarang anda tahu sebabnya, ia akan menjadi lebih mudah untuk menanganinya

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="515" height="320" id="123" title="123" align="middle">
 <param name="allowScriptAccess" value="always" />
 <param name="movie" value="123.swf">
 <param name="quality" value="high">
  <param name="wmode" value="transparent" />
 <embed src="123.swf" name="123" quality="high" allowScriptAccess="always" swLiveConnect="true" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="515" height="320"></embed>
</object>

Tukar teg yang dibenamkan dalam Flash kepada yang di atas, dan semuanya OK!

Saya harap artikel ini akan membantu reka bentuk pengaturcaraan JavaScript semua orang.

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn