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>

網誌管理員已經移除這則留言。
回覆刪除