足球盘口软件
当前位置: 足球盘口软件 > 前端 >
JS访问SWF的函数用法实例,复制Input内容的js代码_支持所有浏览器足球盘口软件

JS访问SWF的函数用法实例,jsswf函数实例

本文实例讲述了JS访问SWF的函数用法。分享给大家供大家参考。具体分析如下:

关于Flash和JS相互调用的例子已经说很多了,这不是难题,当然,调用错误这也不是Flash和JS的错误,我们今天就来彻底解决IE,FF和Chrome之间的不兼容问题!

我们知道,Flash中,如果访问外部JS函数,只需  复制代码 代码如下:flash.external.ExternalInterface.call("JS中的函数名");这一句即可

如果要JS访问Flash中的函数,需要用addCallBack注册一个回调函数,让JS去调用(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")

我们可以trace一下,这个时候如果是true,表示注册成功

OK,下面web中试用一下:

<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,我们在Web中加一个button来调用这个flashcall:<input type="button" onclick="flashcall('./image/1.jpg')" value="JS调用SWF">

测试一下:

IE6,7,8,9一切正常

FF:失败

Chrome:失败

失败原因:SetImgPath不是函数,(is not a function /not defined)

这就很奇怪了,我们可以用一个alert,来输出复制代码 代码如下:thisMovie("123"):alert(thisMovie("123"));

输出结果并不是Null,说明已经找到了我们的Flash,但是为啥FF和Chrome就总是找不到函数呢?

逛了各大论坛,比较一致的说法是addCallback必须要是flash加载完毕才能注册成功,好吧,我们加一个settimeout函数,判断是否加载成功,我们改一下上面的flashcall:

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

恩,我们用个settimeout,每隔100毫秒去调用一次,如果异常就持续调用,直到成功为止!

遗憾的是,始终不成功,程序进入死循环!

通过查阅各种资料,终于找到了原因:

FF中浏览器只认识embed标记,所以如果你用getElementById获 flash的时候,需要给embed做ID标记,而IE是认识object标记的 ,所以你需要在object上的ID做上你的标记

明白了吗?原来在FF和Chrome中,Flash必须用embed才能识别出他的ID,用Object标签是无法识别ID的,我用的Html是Flash自动生成的,都是Object标签,害我调试了一个下午,才明白原来问题出在这里。

知道原因了,就好处理了,改标签:

<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>

把嵌入Flash的标签改为上面的,一切OK!

希望本文所述对大家的javascript程序设计有所帮助。

本文实例讲述了JS访问SWF的函数用法。分享给大家供大家参考。具体分析如下: 关于Flash和JS相互调...

足球盘口软件 1
但IE6两行JS代码就可以,IE7以上也差不多,只不过出来一个安全提示比较恶心,用户如果看到了,一定有怀疑;
再但就是Firefox、Chrome等根本就不让你复制;
记得以前网上有这方面的代码,找了一下,发现全部不能在firefox3.5以上的版本中应该,最后终于找到了一个,代码还相当相当的复杂,不太敢用。
最后,憋的实在没有办法了,查了查资料,自已写了一个:
主要的理解的几个点:
1、Firefox这些浏览器,出于安全考虑吧,直接是不让复制的;
2、在Flash中,可以用System.setClipboard(),把内容扔到剪贴板上,然后再让FLASH工作在Firefox下;
3、在Flash播放器10.0之后呢,也是出于安全考虑吧,System.setClipboard的内容必须在FLASH里边;
4、用ExternalInterface可以和JS通信;
5、ExternalInterface在flash8中必须引用一下才可以;
默认的HTML代码:

复制代码 代码如下:

<input type="text" id="testInput" name="testInput" value="4234324234" />
<div id="buttonBox">
<button onclick="copy('testInput')">copy</button>
</div>

所以,设计的时候,先作第一个判断,如果是IE,就还用默认的代码,这样最没有问题,如果不是,就用一个FLASH把默认的按钮覆盖;

复制代码 代码如下:

if (window.XMLHttpRequest){//如果不是IE时,就用FLASH的方式复制
$('buttonBox').innerHTML = '<embed src="flashCopy.swf" width="48"
height="23" quality="high"
pluginspage=""
type="application/x-shockwave-flash"></embed>';
}

以下是所有的JS文件:

复制代码 代码如下:

<script>
function $(id){
return document.getElementById(id);
}
function copy(){//ie6
var value = $('testInput').value;
window.clipboardData.clearData();
window.clipboardData.setData("Text", value);
alert('复制成功!');
}
function flashCopy(){//firefox .......
return $('testInput').value;
}
function flashCopyBack(){
alert('复制成功!');
}
if("v" != "v"){//如果不是IE时,就用FLASH的方式复制
$('buttonBox').innerHTML = '<embed src="111.swf" width="48" height="23" quality="high" pluginspage="" type="application/x-shockwave-flash"></embed>';
}
</script>

FLASH按钮的代码如下:

复制代码 代码如下:

on (release) {
import flash.external.ExternalInterface;
var inputText = ExternalInterface.call('flashCopy');
System.setClipboard(inputText);
ExternalInterface.call('flashCopyBack');
//_root.boboText.text = inputText;
}

原理,就是避开那个安全上的限制,在点FLASH中的按钮时,通过FLASH中的代码去调页面中的JS代码,JS代码可以拿到INPUT中的值,然后再传给FLASH,这时,FLASH中就有了这些值了,然后,FLASH自已再通过System.setClipboard把这些值存到剪贴板上; 再然后,他再去调用页面中的flashCopyBack,flashCopyBack只干一件事,就是提示已复制成功!
我在Firefox、chrome、ie中都测过了,没有问题,如果谁发现有问题,请告诉我,谢谢,因为我现在已经开始用!
转载请注明出处:子鼠

再但就是Firefox、Chrome等根本...

返回顶部