生为程序员,死做程序鬼
.NET开始,JavaScript结束?
随笔 - 7,  文章 - 0,  评论 - 143,  阅读 - 28797

      关于我的SWFObject V1.5的使用过程,以上篇中的介绍暂时告一段落了,下面我将会带领SWFObject V2.1出场与大家见面,
如果我早一点结识V2.1的话,或许就不会受到“等待HTML DOM加载”问题的侵扰了。 

     首先,给大家简要介绍一下V2.1语法的调用示例:

复制代码
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
//1、使用Json初始化变量、参数、属性
    var flashvars = {
      name1: 
"hello"
,
      name2: 
"world"
,
      name3: 
"foobar"

    };
    
var params = {
      menu: 
"false"

    };
    
var attributes = {
      id: 
"dynamicContent2"
,
      name: 
"dynamicContent2"

    };
    swfobject.embedSWF(
"test6_flashvars.swf""content2""300""120""6.0.0""expressInstall.swf", flashvars, params, attributes);

//2、传统的初始化设置,效果一样

    var flashvars = {};
    flashvars.name1 
= "hello"
;
    flashvars.name2 
= "world"
;
    flashvars.name3 
= "foobar"
;
    
var params =
 {};
    params.menu 
= "false"
;
    
var attributes =
 {};
    attributes.id 
= "dynamicContent3"
;
    attributes.name 
= "dynamicContent3"
;
    swfobject.embedSWF(
"test6_flashvars.swf""content3""300""120""6.0.0"

"expressInstall.swf"
, flashvars, params, attributes);

//3、直接写在后面,就一句话,简洁剽悍,不拖泥带水

    swfobject.embedSWF("test6_flashvars.swf""content5""300""120"
"6.0.0""expressInstall.swf", {name1:"hello",name2:"world",name3:"foobar"}, {menu:"false"}, {id:"dynamicContent5",name:"dynamicContent5"
});
</script>
复制代码


     从我个人来讲,我比较喜欢上面的第三种写法,下面即将提到,我在HTML代码中嵌入Flash文件的最终解决方案中,就是采取的
第三种风格调用的swfobject.embedSWF()。V2.1版本的风格非常符合现代JS的风格,代码显得更为简洁。

     上篇中采取的解决方案看来,似乎已经能够满足大部分需求,而且兼容性似乎也还过得去,理应能够满足绝多数朋友的需求,也未
尝不可是一个过得去的解决方案。但是,有一种比较极端的情况被我发现,就是在:

new SWFObject("http://www.pec365.com/Flash/20071113.swf""mymovie""304""367""7""#FFFFFF");

的时候,如果传入的Flash文件的地址有误,又或者该Flash文件在服务器中被删除掉了,那么你将看到一种最不愿意看到的情况,示例
如下:

复制代码
<html>
<title>DEMO</title>
<head>
<script type="text/javascript" src="swfobject_source.js"></script>
</head>
<body>
   
<form id="Form1">
      
<div id="flashcontent">
         
<a href="http://www.adobe.com/go/getflashplayer">
            
<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" border="0" /
         </a>      
      </div>
   </form>
   <script type="text/javascript">
       
// 注意,我在Flash文件名前加了一个f
       var so = new SWFObject("http://www.pec365.com/Flash/f20071113.swf""mymovie""304""367""7""#FFFFFF");
       so.write(
"flashcontent"
);
   
</script>

</body>
</html>
复制代码


 
    建议您亲自执行一下这段代码,如果您是一名新手可参见上篇中说介绍的步骤来运行一下这段代码,真实的感受一下“灾难”的降临。

     是的,您将看到页面上一片空白,那原本用于替换不能显示Flash时备用的图片也不见了,去了哪里呢?我经过调试后发现,纵使
因为传入的Flash文件地址错误,也会创建一个错误的<object [……]></object>标签将<div id="flashcontent">[……]</div>中的
内容替换掉,从而就是你看到的,将形成一个高宽分别为304px和367px的空白区域(如果安装了Flash播放器,在屏幕左上角点击鼠标
右键,您会有所发现),于是噩梦就如此降临了。

     为了解决这个噩梦般的结果,于是乎,我就想到一个馊主意,首先检查一下根据传入的Flash文件地址检查一下服务器上是否真的存
在该文件,如果返回的结果是该Flash文件存在,那么就执行swfobject.embedSWF()方法,而具体的思路就是利用XMLHttpRequest
对象,通过GET/HEAD方式请求服务器,然后判断xmlHttp.status == 200 || xmlHttp.status == 302作为文件存在的依据,但是这
种方式似乎还是存在一定的缺陷,暂时我还没有能力完善,现将我最终的解决方案示例如下:

复制代码
<html>
<title>DEMO</title>
<head>
<script language="javascript" type="text/javascript" src="JavaScript/swfobject.js"></script>
<script type="text/javascript">
(
function() {
    
var
 xmlHttp, 
    result,
    flashURL 
= "http://www.pec365.com/Flash/20071113.swf"
;
                
    
var checkFlashURL = function
(url) {   
        xmlHttp 
=
 GetXmlHttpObject();
        xmlHttp.onreadystatechange 
= function
() {
            
if ( xmlHttp.readyState == 4
 ) {
                
if ( xmlHttp.status == 200 ||
 
                          xmlHttp.status 
== 302
 ) {
                    
return (result = true
);
                     }
            }   
        };
        xmlHttp.open(
"HEAD", url, true
);   
        xmlHttp.send(
null
);   
    };   

    
var GetXmlHttpObject = function
() {
        
var xmlHttp = null
;
        
try
 {
            
// Firefox, Opera 8.0+, Safari

            xmlHttp = new XMLHttpRequest();
        }
        
catch
 (e) {
            
// Internet Explorer

            try {
                
// Older IE

                xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
            } 
catch
 (e) {
                    
// New IE

                    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
        }
                    
        
return
 xmlHttp;
    };
            
    
// 就是用于检查服务器上指定的Flash文件是否存在 

    checkFlashURL(flashURL);
                
    
    window.onload 
= function
() {
        
if
 ( result ) {
            swfobject.embedSWF(flashURL, 
"flashcontent""304""367""10.0.0""expressInstall.swf", {}, { quality:"autohigh", wmode:"transparent"
 }, {}); 
        } 
        
else
 {
            window.alert(
"您的Flash地址无效,请仔细检查");        // 只是用于调试时检查Flash地址地否正确

        }
    }
})();
</script>

</head>
<body>
   
<form id="Form1">
      
<div id="flashcontent">
         
<href="http://www.adobe.com/go/getflashplayer">
            
<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" border="0" /> 
         
</a>
      
      
</div>

   
</form>
</body>
</html>
复制代码

 

     哇,用了数小时在把这两篇文字折腾好,不小心在公司呆到快22点了,保安来赶人了,想草草收场吧,明天上班得空再来雕琢一
下文字,呵呵。

 


 

posted on   rainnoless  阅读(6121)  评论(5编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

< 2009年2月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
1 2 3 4 5 6 7
8 9 10 11 12 13 14
点击右上角即可分享
微信分享提示