[英]JavaScript code inside UpdatePanel
好的:我在包含單個占位符的aspx頁面上有一個UpdatePanel。
在這個占位符中,我根據某些外部條件(這是一個配置頁面)附加了一個用戶控件中的一個。
在每個用戶控件中都有一個bindUcEvents()javascript函數,它將各種jQuery和javascript事件綁定到usercontrol中的按鈕和驗證器。
我遇到的問題是usercontrol的javascript未被識別。 通常,updatepanel內部的javascript會在updatepanel回發時執行,但是頁面中找不到這些代碼(我嘗試通過firebug的控制台手動運行該函數,但它告訴我它找不到該函數)。
有沒有人有什么建議?
干杯,艾德。
編輯:
削減(但功能)的例子:
標記:
<script src="/js/jquery-1.3.2.min.js"></script>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="Script" runat="server" />
<asp:Button ID="Postback" runat="server" Text="Populate" OnClick="PopulatePlaceholder" />
<asp:UpdatePanel ID="UpdateMe" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Postback" EventName="Click" />
</Triggers>
<ContentTemplate>
<asp:Literal ID="Code" runat="server" />
<asp:PlaceHolder ID="PlaceMe" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
C#:
protected void PopulatePlaceholder(object sender, EventArgs e)
{
Button button = new Button();
button.ID = "Push";
button.Text = "push";
button.OnClientClick = "javascript:return false;";
Code.Text = "<script type=\"text/javascript\"> function bindEvents() { $('#" + button.ClientID + "').click(function() { alert('hello'); }); } bindEvents(); </script>";
PlaceMe.Controls.Add(button);
}
即使代碼存在於頁面上,您也會看到按鈕沒有彈出警告消息。
EDIT2:
好吧,只是為了說清楚,生產代碼比綁定到文字的單個函數復雜得多,並且包含大量的
<%= Control.ClientID %>
一些代碼將很難分解為非特定函數,並且毫無意義,因為它們每個都只在一個地方使用(我們說的是非常具體的驗證和奇怪的彈出觸發器+一些邏輯)。
擺脫Literal控件並使用ScriptManager注冊腳本。 你正在做的事情由於同樣的原因不起作用
window.document.getElementById('someId').innerHtml = "<script type=\"text/javascript\">alert('hey');</script>";
不起作用。 試試這個:
protected void PopulatePlaceholder(object sender, EventArgs e)
{
Button button = new Button();
button.ID = "Push";
button.Text = "push";
button.OnClientClick = "return false;";
string script = "function bindEvents() { $('#" + button.ClientID + "').click(function() { alert('hello'); }); } bindEvents();";
ScriptManager.RegisterClientScriptBlock(this.Page, typeof(SomeClass), Guid.NewGuid().ToString(), script, true);
PlaceMe.Controls.Add(button);
}
RegisterClientScriptBlock的參數可能需要改變,但你明白了。
要在更新面板觸發后重新運行一些js,我總是使用它
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
function(sender, args) {
//update whatever here
});
此外,如果您對更新面板中的元素有任何引用,您也可以刷新該函數中的那些變量,否則您將擁有不起作用的舊引用。
將scriptmanager(Ajax Extensions)添加到您的頁面,並在該管理器中添加您的腳本引用。 管理器將在基於ajax的頁面加載(而不僅僅是初始加載)上加載每個腳本標記 - 在updatepanel中移動所有需要的javascript代碼,你已經完成了很多工作。
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Scripts>
<asp:ScriptReference Path="../lib/jquery-1.2.6.pack.js" />
沒有讀好這個問題(沒有樣本)。 看到我的新回復。
也許你正在尋找這個: http : //api.jquery.com/live/
幾乎與.bind()兼容(上面的鏈接中列出的例外) - 但也綁定到稍后添加/更改的元素。
或者也可以嘗試使用.delegate() - 不能直接替換.bind()調用,但在大多數情況下要快得多。
不知怎的,似乎你的Code.Text在某處翻譯丟失了 - 不知道具體細節,也許是設計上的; 無論如何,下一步確實有效:
protected void PopulatePlaceholder(object sender, EventArgs e)
{
Button button = new Button();
button.ID = "Push";
button.Text = "push";
button.OnClientClick = "javascript:return false;";
// Code.Text =
PlaceMe.Controls.Add(button);
PlaceMe.Controls.Add(new LiteralControl("<script type=\"text/javascript\"> function bindEvents() { $('#" + button.ClientID + "').click(function() { alert('hello'); }); } bindEvents(); </script>"));
}
由於您已經從代碼隱藏構建了javascript代碼,因此您也可以動態添加控件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.