摘要:Javascript + Flash + ASP + DB 傳變數、傳值
最近有一個需求就是做個問卷讓使用者作答,問卷這東西網路資源頗多,當然也包括之前談到的「利用 Google Docs 輕鬆完成你的問卷」,但是需求是要整合在系統裡,而系統雖然不是什麼 ERP 這類龐大的程式,但也混雜著 HTML、javascript、asp、aspx(VB C#都有)、Database、Flash與LRN。有些程式資料夾是位於網頁目錄下,有些以 frameset 與 LRN 方式載入的網頁卻放在一般的目錄下,所以無法執行程式的呼叫 ...... 總總因素導致蠻簡單的功能,花了我一小段時間。 底下就以問題+答案的方式來描述。 問題集: Q1:怎樣在網頁 HTML 中插入 Flash ? -----分隔線~開始來說說各問題怎麼解!---------------- Ans:這個很簡單,就如同在網頁裡插入 youtube 的影片{ref}一樣!通常是類似下面這段程式碼! --- Ans:有兩種方式,第一種同程式傳遞參數方法一樣,第二種透過 FlashVars 傳遞 第二種透過 FlashVars 傳遞 Ans:ㄝ~因為我不太會 Flash ,所以這邊是用很簡略的方式來傳接值,有興趣的朋友可以研究一下 Flash 相信會有更好的方式來處理。我還是來說說超基礎的傳接值 為了測試參數值是否傳入 Flash 裡,你可以簡單點取文字,屬性更改為「動態文字」,然後給予相同的變數名稱,他就會自動接你所傳入的參數了! 如果「Ctrl-Enter」時,可以看到 Flash 畫面中出現你所傳入的值,那就表示能正常接收外部來的變數了。 Ans:你或許會問,既然可以用?後面串變數,為何還需要提供兩種方法呢?如果你仔細比對上面的程式碼,你會發覺我在 FlashVars 時,多宣告了 codebase ,不同的 Flash 版本會有不同的支援程度,這點請大家注意一下版本。 使用靜態(手動)的方式,去變更 FlashVars 的變數,可以輕鬆的達到你要的結果,但是想要動態的傳遞,也許你會用 但小弟的環境在呼叫 Flash 程式碼是被放在非網頁目錄下,意即是不能執行 ASP 或 PHP,而使用 Javascript 來呼叫似乎 param 是靜態的,無法跟著變動參數值~~~那該怎麼辦?我使用的方法如下 ====== 1. 在 <head>裡增加一段 javascript </head> function bbind() 2. 在插入的 object 裡宣告 id 值 3. 在 body 的 onload 事件裡去呼叫之前定義的 javascript Function 意思是在 body 載入(load) 時呼叫 bbind() ,然後去 getElementById 取得名稱為 flashvars1 的物件,找出參數 FlashVars 並重新給定值 GetQueryString("uid")。 ====== Ans:據 Google 得到的結果,Flash 並無法直接寫入到資料庫,必須透過「程式ASP.NET、PHP......」去做寫入的動作。所以拆成 Q5-1~Q5-3 三個步驟來寫! 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 Ans:ASP.NET 的傳入參數有 Request.Form 跟 Request.Querystring ,如果只抓某個參數的值,可以使用「Request.QueryString("uid")」 檢查參數合法性可以參考:「Link」 Ans:用最簡單的方式 1.增加一個 SqlDataSource 並設定資料庫連線、對應資料表、對應欄位,只要有包含到 Primary key 就能直接讓你有新增、刪除、更新等能力。 利用 InsertParameters / UpdateParameters 來設定值,而不要用 Sqlcommand 用串的方式(SqlInjection 問題) 利用 Try...Catch 包住執行 I/U/D 的呼叫! Try 當然你可以插入Insert 前,先判斷資料是否已經存在,若存在則用更新 Update 方式 Dim arguments As DataSourceSelectArguments = New DataSourceSelectArguments 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>") Ans:如果要抓取網頁的 Title 你可以使用 var stitle = document.title 但如果有使用 Frameset 切網頁畫面,這時你就必須用 var stitle = parent.document.title; 來抓上一層的 Title 值 萬一,被 Frameset 切了好幾次,可以看到在同一視窗的 Title 值,卻抓不到~~這時你就必須用 var stitle=top.parent.document.title; 註:哇~瘋了.....這寫了2小時.....緊酸 ~ End
Q2:怎樣傳參數給 Flash ?
Q3:在 Flash 裡怎麼接參數?
Q4:怎樣動態改變傳入 Flash 的變數值?
Q5:Flash 的結果怎麼輸出寫入到資料庫裡?
Q5-1:Flash 怎麼把變數值傳出來?
Q5-2:ASP.NET 怎麼接參數?
Q5-3:ASP.NET 怎麼把內容寫到資料庫裡?
Q6:怎麼自動關閉視窗?
Q7:怎麼抓取網頁的標題(Title)的內容值?
<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>
第一種傳遞參數方法,串在 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>
<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>
<param name=FlashVars value="javascript:parameter" /> 或 <param name=FlashVars value="<% ...... %>" />
{
var id=GetQueryString("uid");
document.getElementById('flashvars1').FlashVars = 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>
<body onload="javascript:bbind()">
Sql_user.UpdateParameters("uid").DefaultValue = userID
Sql_user.Insert()
Catch ex As Exception
showbox("資料庫新增失敗!")
End Try
Dim dv As Data.DataView = Sql_user.Select(arguments)
If dv.Count >= 1 Then
Sql_user.Update()
else
Sql_user.Insert()
endif