簡體   English   中英

UpdatePanel中的JavaScript代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM