jQuery 失效問題
在一個 WebForm 中,若使用 UpdatePanel 做局部更新,且 UpdatePanel 中的元件同時使用 jQuery 進行操作,這時 jQuery 功能只會在網頁第一次載入後有效,只要 UpdatePanel 中發生任何 Postback 行為,那麼 jQuery 功能將會失效。 例如下面這個例字,如果按了 Button1 產生 Postback 之後再按 Click 就不會再執行 alert() 功能。
<head id="Head1" runat="server"> <title></title> <script type="text/javascript" src="Scripts/jquery/jquery-1.11.2.js"></script> <script type="text/javascript"> $(document).ready(function () { $("#Click1").click(function () { alert('Click1'); }); }); </script> </head> <body> <form id="form1" runat="server"> <div> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> <ContentTemplate> <asp:Button ID="Click1" runat="server" Text="Click1" OnClientClick="return false" /> <asp:Button ID="Button1" runat="server" Text="PostBack"/> </ContentTemplate> </asp:UpdatePanel> </div> </form> </body>
這是因為在 Postback 之後,UpdatePanel 中的元件會重新繪製,但不會再重新執行 $(document).ready() 函式,所以原先的事件綁定行為也就不存在了。
解決 jQuery 失效問題
要解決 jQuery 失效問題,有以下二個方法:
將事件綁定設定寫在 Ajax 的 End_request 事件中
當 ScriptManager 發生 Postback 之後都會引發 EndRequest 事件,所以只要註冊這個事件,並且在這個事件中重新執行控制項的綁定行為。
<head id="Head1" runat="server"> <title></title> <script type="text/javascript" src="Scripts/jquery/jquery-1.11.2.js"></script> <script type="text/javascript"> $(document).ready(function () { BindEvents(); }); function BindEvents() { $("#Click2").click(function () { alert('Click2'); }); } </script> </head> <body> <form id="form1" runat="server"> <div> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <script type="text/javascript"> Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequest); function EndRequest(sender, args) { if (args.get_error() == undefined) { BindEvents(); } } </script> <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional"> <ContentTemplate> <asp:Button ID="Click2" runat="server" Text="Click2" OnClientClick="return false" /> <asp:Button ID="Button2" runat="server" Text="PostBack"/> </ContentTemplate> </asp:UpdatePanel> </div> </form> </body>
將事件綁定設定寫在 pageLoad() 方法中
因為 WebForm 不管是發生 PageLoad 或 Postback ,當返回用戶端時都會執行 pageLoad() 方法,所以也可以將事件綁定的設定寫在 pageLoad() 方法中即可。
<head id="Head1" runat="server"> <title></title> <script type="text/javascript" src="Scripts/jquery/jquery-1.11.2.js"></script> <script type="text/javascript"> function pageLoad() { $("#Click3").click(function () { alert('Click3'); }); } </script> </head> <body> <form id="form1" runat="server"> <div> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <asp:UpdatePane3 ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> <ContentTemplate> <asp:Button ID="Click3" runat="server" Text="Click3" OnClientClick="return false" /> <asp:Button ID="Button3" runat="server" Text="PostBack"/> </ContentTemplate> </asp:UpdatePanel> </div> </form> </body>
網誌管理員已經移除這則留言。
回覆刪除