UpdatePanel Wrapper中的jQuery,用于PageRequestManager.getInstance()。add_endRequest

时间:2011-03-18 09:54:19

标签: jquery asp.net asp.net-ajax updatepanel

当jQuery应用于UpdatePanel中的元素时,当UpdatePanel刷新时,jQuery不会应用于新注入的HTML。

使用

解决了此问题
Sys.WebForms.PageRequestManager.getInstance().add_endRequest()

注册AJAX请求完成时要调用的函数:

我编写了一个函数,用add_endRequest注册函数,并同时调用它:

Async.RegisterAndRun = function(callback) {
    //register function to be run when an update panel request is complete
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(callback);
    //also run the function right now.
    callback();
};

现在我们需要调用的是

Async.RegisterAndRun(AddFancyjQueryToMyHTML);

Async.RegisterAndRun(function(){
    AddFancyjQueryToMyHTML();
    AddMoreFancyjQueryToMyHTML('with', 'args');
});

我的问题是,您能想出改善这种情况的方法吗?目前它做了我需要它,我永远不需要显式调用add_endRequest,这很好。

2 个答案:

答案 0 :(得分:0)

我建议的第一个改进是不使用add_endRequest而是使用add_pageLoaded()。 在加载页面DOM时,实际上会调用add_pageLoaded回调,并准备好被其他库使用。

我遇到过很多次这个Update面板的DOM元素问题最终成为jQuery选择器中的ghost元素。但是,如果您不在jQuery选择器中缓存DOM元素,即您没有执行

var myGrid = $(".Grid")

然后你应该没问题,因为在更新面板更新结束后,做$(“。Grid”)将始终为你提供正确的DOM元素。

但是,如果您的问题与DOM元素关联的事件处理程序有关,那么实现此目的的一种简洁方法是将事件处理程序定义为

$("#myVanishingElement").unbind().die().live("event","handler");

这将确保您只需要调用此代码一次(而不是每次调用add_endRequest)。 jQuery的实时机制可以自动处理从页面中出现和消失的元素。

此方法的主要问题是,在Updatepanel第一次回发之前,您的元素尚未就绪。要解决这个问题,请在JS脚本中定义名为(完全相同)pageLoad的函数

function pageLoad(sender, e) {
//jQuery event binding goes here.
}

每个Asynch回发调用都会由MS Ajax库自动调用此函数。这是MS AJAX库中的内置功能。当然,这也意味着您只能在代码中全局定义一个“pageLoad”事件处理程序。

我最近写了一个客户端框架,它使用DOM做了很多聪明的事情,这些事情被MS Ajax和jQuery并行工作所改变。它考虑了竞争条件,DOM元素的可用性,各种事件处理程序的初始化和处理等。如果您愿意,我将很乐意分享它。

答案 1 :(得分:-1)

            with(Sys.WebForms.PageRequestManager.getInstance()  ) {
                add_beginRequest(onBeginRequest);
                add_endRequest(onEndRequest);
            }

            function onBeginRequest(sender, args) {
         //       $.blockUI({ message: "<h3>.منتظر باشید</h3>  IranFairCo.com",overlayCSS:     { backgroundColor: '#00f' }});
            }

            function onEndRequest(sender, args) {
           //     $.unblockUI();
            }