当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,这很好。
答案 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();
}