簡體   English   中英

異步回發不會導致document.ready執行

[英]Async postback doesn't cause document.ready to be executed

我必須對幾頁中使用的用戶控件實施一些更改。 用戶控件包含一些JQuery來處理分頁任務(顯示3個月的數據並一次隱藏9個)。 加載控件后,它將自動顯示當前季度並在$(document).ready()中執行此代碼。

我遇到的問題是,在其中一個頁面中使用了用戶控件,該控件在頁面加載時不可見。 異步回發用於更改可見性,但這不執行ready()。

我找到了一個片段,允許托管頁面攔截部分回發的EndResponse,但我仍然無法在usercontrol中執行該功能。

有沒有人有什么建議?

干杯

戴夫

就像我一樣,你會討厭微軟規定的答案。 “規定”的答案是使用PageRequestManager來設置請求處理程序。 在每個部分回發完成之后(然后)執行該請求處理程序。

請求處理程序示例:

<script id="events" type="text/javascript">

    jQuery(document).ready(function() {

        // Your normal code goes here
        setupSomething();
        initializeSomethingElse();

        // Setup your partial-postback event handler.
        // This is used to rewire all events since all are 'lost' after partial-postback.
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(requestHandler);
    });

    ///<summary>partial postback event handler. Executed after the partial postback is completed. Clears modal popup textboxes</summary>
    ///<param name="sender"></param>
    ///<param name="args">http://www.asp.net/ajax/documentation/live/ClientReference/Sys.WebForms/EndRequestEventArgsClass/default.aspx</param>
    function requestHandler(sender, args) {

        if (args.get_error() == undefined) {

            // Your normal code goes here
            setupSomething();
            initializeSomethingElse();
        }
        else
            alert(args.get_error()); // Do something
    }
</script>

這讓我們回答簡單的答案:
為什么不從代碼隱藏中明確初始化用戶控件,並在用戶控件HTML(本身)中保持初始化JavaScript。

void YourUserControl_PreRender(object sender, EventArgs e)
{
    try
    {

    }
    catch (Exception ex)
    {

    }
    finally 
    {
        // Do this
        ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "registerInitializer", buildInitializer(), true);
    }
}

渲染完成后,“buildInitializer”邏輯會說:“如果客戶端上存在此函數,請調用它。” 並且......每次都有效。

private string buildInitializer()
{
    StringBuilder javascript = new StringBuilder();

    javascript.Append("if (window.initializeMyControl) {");
    javascript.Append("if(typeof window.initializeMyControl == 'function') { initializeMyControl(); }");
    javascript.Append("}");

    return javascript.ToString();
}

現在,您的用戶控件初始化可以存在於用戶控件所在的位置:

<script type="text/javascript">
    function initializeMyControl() {

        // Your normal code goes here
        setupSomething();
        initializeSomethingElse();
    }
</script>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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