我希望UpdatePanel中的Button在觸發非同步的Postback後,除了更新Update Panel中Label的值,還可以觸發一段Javascript,呼叫前端的Javascript Function。試了幾種方法都失敗了!

1) Response.Write想當然不Work,因為ASPX網頁並沒有重新Render。
2) 加了一個Literal在UpdatePanel中,設定Literal1.Text="<script>blah();</script>"。用Fiddler看到這段內容被傳回來了,但我猜UpdatePanel是用置換InnerHTML的方式動態更新UpdatePanel的內容,所以其中的Javascript並沒有被執行。
3) Google了一下,有些人建議用Page.RegisterStartupScript來做。我有點懷疑它的原理,不過既然有人說Work,我就試試。最後證實這招也不管用,或許Atlas到ASP.NET AJAX間做了什麼大改。

最後,找到一篇文件,作者跟我一樣搞不出RegisterStartupScript的把戲,所以改用
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(blah);
的方式,加掛endRequest事件以呼叫自訂的Javascript Function。Ya, it works!

只是此招每次非同步呼叫後都會被觸發,要用一些技巧去區別後端處理邏輯為何並依執行結果做不同的處理。(最簡單的方法是將資料放在TextBox中,前端用$get("txtName").value就可輕鬆取回)


Comments

# by 小咪

使用您的方法..在後端指定 txtName.text ="hello" 但是 到前端後..它的值依然為空白.

# by Jeffrey

先確認TextBox有被包在UpdatePenel中,才會被動態更新。 我想可以先做一個測試,在UpdatePanel中放一個Button,由它來觸發更新(這是最標準的做法),確定在這種狀況下可以動態更新,再來測試用Javascript觸發的方法。 如果還是找不出問題,可以到討論區(看關於作者)把你的Code貼上來,我再幫忙看看。

# by 丫米

由於看了您的提示,但毫無概念的我,還是測試失敗, 可否提供簡易範例,以供參考呢?

# by 丫米

看過您所提示的相關資訊,還是測試失敗, 可否拜託您提供簡易的範例呢?

# by Jeffrey

To 丫米, 送你一個http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/12/08/updatepanel-call-javascript-sample.aspx, 接好囉!

# by Ammon

改用 ScriptManager.RegisterStartupScript 就可以了 另外要注意 Control 參數是要有update的control才行 不能通通用 page

# by Jeffrey

To Ammon大, 領教了! 已將你的好方法收納入Post中!

# by XBaby

可以試試下面的作法..... ^o^y 參考參考 ///----------------------------------------------------------- /// <summary> /// 直接執行頁面寫好的 JavaScript /// </summary> /// <param name="cCmd">要執行的指令</param> public static void RunJavaScript(Page oPage, string cCmd) { string js = ""; js = "<script type='text/javascript'>" + cCmd + "</script>"; // GetRndString() 是自己寫的亂數字串函數,可以改成隨便一個字串就好了 ScriptManager.RegisterClientScriptBlock(oPage, js.GetType(), GetRndString(), js, false); } 使用時: RunJavaScript(this, "ShowMessage1();");

# by Penny Yip

You can also try using ClientScript.RegisterStartupScript and in the JavaScript, use the Sys.Application.add_load( function() { //JS here; }); And the JS inside the block will be executed everytime the page is posted back

# by 小熊子

當決定使用 UpdatePanel 之時,也要記得小心運用 client side javascript ,常常在非同步 postback 之後,之前掛的 event / startup script 都會失效。 這已經偏向系統架構的決擇。 痛苦兩個禮拜的小熊子經驗分享

Post a comment