[Flash] 解決在 IE 中 Flash 影片會被要求按一下按鈕的問題

或許你也曾發現嵌在網頁中的 Flash 影片(如果你不清楚如何在網頁中嵌入 Flash 影片的話,可以參考「在網頁中插入影片 」一文),當呈現在 IE 瀏覽器裡時,會出現要求你按一下讓影片才能啟動的問題。這篇文章就是解決該問題的方法...

這是微軟的 Knowledge Base 中所發表的文章: http://support.microsoft.com/default.aspx?scid=kb;zh-tw;555662&sd=rss&spid=6351

在這個文章中解釋了如何解決我在標題中所說明的問題。也就是說,或許你也曾發現嵌在網頁中的 Flash 影片(如果你不清楚如何在網頁中嵌入 Flash 影片的話,可以參考「在網頁中插入影片 」一文),當呈現在 IE 瀏覽器裡時,會出現要求你按一下讓影片才能啟動的問題。這篇文章就是解決該問題的方法。

做法很簡單,就是套用一道 JavaScript 指令來輸出 <object ...></object> 這道 HTML 指令,而且不能直接輸出,而是要寫在外部 .js 程式中。

以下是詳細的步驟:

  1. 從 VS2005 中加入一個 Jscript 程式,例如名為 Mainshow.js
  2. 把原來的 <object...></object> 指令包在 document.writeln 指令中
  3. 從 .aspx 程式中,將原來的 <object...></object> 指令改掉,讓它變成 <script ... src="Mainshow.js"></scipt>

例如,.aspx 中內容原來是:

        <object width="570" height="180" id="Photo-Poster" type="application/x-shockwave-flash"
            classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"  codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0">
            <param name="allowScriptAccess" value="false" />
            <param name="movie" value="Images/Photo-Poster.swf" />
            <param name="loop" value="false" />
            <param name="quality" value="high" />
            <param name="scale" value="exactfit" />
            <param name="wmode" value="transparent" />
            <param name="bgcolor" value="#e0dfe3" />
        </object>

請將它改為:

<script language="javascript" type="text/javascript" src="MainShow.js">
</script>

而 Mainshow.js 的內容則是:

document.writeln('<object width="570" height="180" id="Photo-Poster" type="application/x-shockwave-flash" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0">');
document.writeln('<param name="allowScriptAccess" value="false" />');
document.writeln('<param name="movie" value="Images/Photo-Poster.swf" />');
document.writeln('<param name="loop" value="false" />');
document.writeln('<param name="quality" value="high" />');
document.writeln('<param name="scale" value="exactfit" />');
document.writeln('<param name="wmode" value="transparent" />');
document.writeln('<param name="bgcolor" value="#e0dfe3" />');
document.writeln('</object>');

請注意,我試過將 document.writeln... 寫在 <script...></script> 裡面,結果無效。我也試過將 JavaScript 指令寫成 <script ... /> 結果也無效,甚至會出現錯誤(如果你在程式中用了 Validation 控制項的話)。你必須寫作 <script...></script> 才會生效。當然,我並不知道原因出在哪裡。

我所使用的測試環境是 .NET Framework 2.0。

Re: [Flash] 解決在 IE 中 Flash 影片會被要求按一下按鈕的問題

 

在上面所採用的解決方案中,我們雖然解決了主要的問題,但實際上還有另一個惱人的問題存在,那就是當開發端和伺服器端網站根目錄不一致的時候,所產生位址差異的現象。譬如說,我們在開發端使用的網站根目錄是 "/Solution" 而伺服器端為 "/"。對於普通的網頁控制項,我們可以使用 ResolveUrl 來取得網頁的實際位址,例如:

<script language="javascript" type="text/javascript" src='<%=ResolveUrl("MainShow.js") %>'>
</script>

但是對於已經放置於 .js 中的 .swf 檔案,我們就沒辦法從伺服器端克服這個問題。因為 .js 並非 ASP.NET 支援的檔案類型,我們無法對它撰寫伺服器端程式。但是有一個非常簡單的解決方案,那就是將 .js 以 HttpHandler 程式來產生。

HttpHandler 稱為「泛型處理常式」,您可以在網站中加入這個項目,其副檔案是 .ashx。一般而言,.ashx 通常被用來輸出 XML 或圖片(像是計數器)。不過它也可以輸出各種 MIME 類型的文件(請參考「條列各種 MIME 檔案類型」一文),當然包括文件格式的檔案。

以下我們先來看看範例程式:
 

<%@ WebHandler Language="VB" Class="ShowFlash" %>

Imports System
Imports System.Web

Public Class ShowFlash : Implements IHttpHandler
   
    Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        Dim requestedSource As String = HttpContext.Current.Request("source")
        Dim requestedHeight As Integer = HttpContext.Current.Request("height")
        Dim requestedWidth As Integer = HttpContext.Current.Request("width")
        Dim source As String = HttpContext.Current.Request.ApplicationPath & requestedSource
       
        Dim script As String = _
        "<object classid=""clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"" " & _
        "codebase=""http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0"" height=""" & requestedHeight & """ width=""" & requestedWidth & """>" & _
        "<param name=""quality"" value=""high""/>" & _
        "<param name=""movie"" value=""" & source & """/>" & _
        "<param name=""wmode"" value=""transparent""/>" & _
        "<embed src=""" & source & """ quality=""high"" pluginspage=""http://www.macromedia.com/go/getflashplayer"" type=""application/x-shockwave-flash"" wmode=""transparent"" width=""" & requestedWidth & """ height=""" & requestedHeight & """ />" & _
        "</object>"
       
        Dim sReturn As String = "document.write('" & script & "');"
        context.Response.ContentType = "text/plain"
        context.Response.Write(sReturn)
       
    End Sub
   
    Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
        Get
            Return True
        End Get
    End Property

End Class
 

如果您去呼叫這個程式,它會直接輸出文字,就像你去讀取文字檔一樣。所以你可以將 <script... 指令改成如下的樣子,就可以使用了:

<script language="javascript" type="text/javascript" src="<%=ResolveUrl("~/Flash/ShowFlash.ashx?source=/Flash/MerryChristmas.swf&height=224&width=685")%>" ></script>

請注意, 我讓 ShowFlash.ashx 接收三個參數,其中一個是 .swf 的實際位置,其它兩個則是這段影片的寬度與深度。使用這種方法,你以後就不需要為每個 Flash 影片撰寫 .js 程式了。

此外,如果你留意的話,我把 <embed... 指令加了回來。我原本在「[Flash] 在網頁中插入影片」一文中建議大家不要使用 <embed... 指令,但後來發現若不使用該指令,將無法在 FireFox 中播放 Flash,所以只好又改了回來。
 

 

後記: 這篇文章是在 2006 年發表的, 距今已有一段時間, 各個瀏覽器也都已經有更新的版本, 或許以上所提供的解法已經不一定適用了。


Dev 2Share @ 點部落