Javascript + Flash + ASP + DB 傳變數、傳值

摘要:Javascript + Flash + ASP + DB 傳變數、傳值

 最近有一個需求就是做個問卷讓使用者作答,問卷這東西網路資源頗多,當然也包括之前談到的「利用 Google Docs 輕鬆完成你的問卷」,但是需求是要整合在系統裡,而系統雖然不是什麼 ERP 這類龐大的程式,但也混雜著 HTML、javascript、asp、aspx(VB C#都有)、Database、Flash與LRN。有些程式資料夾是位於網頁目錄下,有些以 frameset 與 LRN 方式載入的網頁卻放在一般的目錄下,所以無法執行程式的呼叫 ...... 總總因素導致蠻簡單的功能,花了我一小段時間。

底下就以問題+答案的方式來描述。

問題集:

Q1:怎樣在網頁 HTML 中插入 Flash ?
Q2:怎樣傳參數給 Flash ?
Q3:在 Flash 裡怎麼接參數
Q4:怎樣動態改變傳入 Flash 的變數值
Q5:Flash 的結果怎麼輸出寫入到資料庫裡
Q5-1:Flash 怎麼把變數值傳出來
Q5-2:ASP.NET 怎麼接參數
Q5-3:ASP.NET 怎麼把內容寫到資料庫裡
Q6:怎麼自動關閉視窗
Q7:怎麼抓取網頁的標題(Title)的內容值

-----分隔線~開始來說說各問題怎麼解!----------------

Q1:怎樣在網頁 HTML 中插入 Flash ?

Ans:這個很簡單,就如同在網頁裡插入 youtube 的影片{ref}一樣!通常是類似下面這段程式碼!
<object width="640" height="385">
<param name="movie" value="Your_Flash_file.swf"></param>
<param name="allowFullScreen" value="true"></param>
<param name="allowScriptAccess" value="always"></param>
<embed src="Your_Flash_file.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="385">
</embed></object>

---

Q2:怎樣傳參數給 Flash ?

Ans:有兩種方式,第一種同程式傳遞參數方法一樣,第二種透過 FlashVars 傳遞
第一種
傳遞參數方法,串在 swf 檔名後面
<object width="640" height="385">
<param name="movie" value="Your_Flash_file.swf?uid=tolarku&sa=true"></param>
<param name="allowFullScreen" value="true"></param>
<param name="allowScriptAccess" value="always"></param>
<embed src="Your_Flash_file.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="385">
</embed></object>

第二種透過 FlashVars 傳遞
<object width="640" height="385" codebase="http://fpdownload.adobe.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0">
<param name=FlashVars value="
uid=tolarku&sa=true" />
<param name="movie" value="Your_Flash_file.swf"></param>
<param name="allowFullScreen" value="true"></param>
<param name="allowScriptAccess" value="always"></param>
<embed src="Your_Flash_file.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="385">
</embed></object>

Q3:在 Flash 裡怎麼接參數?

Ans:ㄝ~因為我不太會 Flash ,所以這邊是用很簡略的方式來傳接值,有興趣的朋友可以研究一下 Flash 相信會有更好的方式來處理。我還是來說說超基礎的傳接值

為了測試參數值是否傳入 Flash 裡,你可以簡單點取文字,屬性更改為「動態文字」,然後給予相同的變數名稱,他就會自動接你所傳入的參數了!


如果「Ctrl-Enter」時,可以看到 Flash 畫面中出現你所傳入的值,那就表示能正常接收外部來的變數了。

 

Q4:怎樣動態改變傳入 Flash 的變數值?

Ans:你或許會問,既然可以用?後面串變數,為何還需要提供兩種方法呢?如果你仔細比對上面的程式碼,你會發覺我在 FlashVars 時,多宣告了 codebase ,不同的 Flash 版本會有不同的支援程度,這點請大家注意一下版本。

使用靜態(手動)的方式,去變更 FlashVars 的變數,可以輕鬆的達到你要的結果,但是想要動態的傳遞,也許你會用
<param name=FlashVars value="javascript:parameter" />  或 
<param name=FlashVars value="<% ...... %>" />

但小弟的環境在呼叫 Flash 程式碼是被放在非網頁目錄下,意即是不能執行 ASP 或 PHP,而使用 Javascript 來呼叫似乎 param 是靜態的,無法跟著變動參數值~~~那該怎麼辦?我使用的方法如下

======

1. 在 <head>裡增加一段 javascript </head>

function bbind()
{
var id=GetQueryString("uid");
document.getElementById('flashvars1').FlashVars = id;
}

2. 在插入的 object 裡宣告 id 值
<object width="640" height="385" id="flashvars1" codebase="http://fpdownload.adobe.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0">
<param name=FlashVars value="
uid=tolarku&sa=true" />
<param name="movie" value="Your_Flash_file.swf"></param>
<param name="allowFullScreen" value="true"></param>
<param name="allowScriptAccess" value="always"></param>
<embed src="Your_Flash_file.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="385">
</embed></object>

3. 在 body 的 onload 事件裡去呼叫之前定義的 javascript Function 
<body onload="javascript:bbind()">

意思是在 body 載入(load) 時呼叫 bbind() ,然後去 getElementById 取得名稱為 flashvars1 的物件,找出參數 FlashVars 並重新給定值  GetQueryString("uid")。

 ======

 

 

Q5:Flash 的結果怎麼輸出寫入到資料庫裡?

Ans:據 Google 得到的結果,Flash 並無法直接寫入到資料庫,必須透過「程式ASP.NET、PHP......」去做寫入的動作。所以拆成 Q5-1~Q5-3 三個步驟來寫!

Q5-1:Flash 怎麼把變數值傳出來?

Ans:在 Flash 中可以使用「getURL("目的網址",開啟方式)」來連結外部網址。所謂的「開啟方式」是指 _blank 開新視窗、_self 同一視窗 ......等等。

而參數的傳遞也是依附在目的網址中(例如:http://sss.aaa/mi.aspx?uid=uuu&sa=true)

在 Flash 中變數字串的串接是使用「+」所以可能為 url= "http://sss.aaa/mi.aspx?rm=memo&uid="+ _root.answer01 +"&sa="+ sa 

Q5-2:ASP.NET 怎麼接參數?

Ans:ASP.NET 的傳入參數有 Request.Form 跟 Request.Querystring ,如果只抓某個參數的值,可以使用「Request.QueryString("uid")」

檢查參數合法性可以參考:「Link

Q5-3:ASP.NET 怎麼把內容寫到資料庫裡?

Ans:用最簡單的方式

1.增加一個 SqlDataSource 並設定資料庫連線、對應資料表、對應欄位,只要有包含到 Primary key 就能直接讓你有新增、刪除、更新等能力。


 

利用 InsertParameters / UpdateParameters 來設定值,而不要用 Sqlcommand 用串的方式(SqlInjection 問題)
Sql_user.UpdateParameters("uid").DefaultValue = userID

利用 Try...Catch 包住執行 I/U/D 的呼叫!

 

Try
     Sql_user.Insert()
Catch ex As Exception
     showbox("資料庫新增失敗!")
End Try

當然你可以插入Insert 前,先判斷資料是否已經存在,若存在則用更新 Update 方式

 

Dim arguments As DataSourceSelectArguments = New DataSourceSelectArguments
Dim dv As Data.DataView = Sql_user.Select(arguments)
     If dv.Count >= 1 Then
Sql_user.Update()
     else
Sql_user.Insert()
     endif

 

Q6:怎麼自動關閉視窗?

 

Ans:要關閉因為 getURL 所跳出來的視窗(因為只要用來寫入到DB,並不是為了給使用者看某些資訊),這時你可以用

Response.Write("<script>window.opener=null;window.close();</script>")

如果在你的環境下,使用上述的方法,會跳出一個警告關閉視窗的畫面,那請改用下面語法就OK了(IE7 OK!,Firefox 沒試過)

Response.Write("<script>void(window.open('','_parent',''));window.close();</script>") 

要讓USER點擊才直接關閉,則用

Response.Write("<a href=javascript:void(window.open('','_parent',''));window.close(); >[關閉視窗]</a>")


Q7:怎麼抓取網頁的標題(Title)的內容值?

Ans:如果要抓取網頁的 Title 你可以使用 var stitle = document.title

但如果有使用 Frameset 切網頁畫面,這時你就必須用 

var stitle = parent.document.title; 來抓上一層的 Title 值

萬一,被 Frameset 切了好幾次,可以看到在同一視窗的 Title 值,卻抓不到~~這時你就必須用 var stitle=top.parent.document.title;

註:哇~瘋了.....這寫了2小時.....緊酸

~ End