我正在使用jQuery在UpdatePanel内的元素上连接一些鼠标悬停效果。事件绑定在$(document)中。准备好了。例如:

$(function() {    
    $('div._Foo').bind("mouseover", function(e) {
        // Do something exciting
    });    
});

当然,这在页面第一次加载时工作得很好,但是当UpdatePanel进行部分页面更新时,它不会运行,鼠标悬停效果在UpdatePanel内部也不再工作。

在第一个页面加载时,以及每次UpdatePanel触发部分页面更新时,建议使用什么方法来连接jQuery中的内容?我应该使用ASP。NET ajax生命周期代替$(document).ready?


当前回答

我也遇到过类似的问题,发现最好的方法是依靠事件冒泡和事件委托来处理它。事件委托的好处是,一旦设置好,就不必在AJAX更新后重新绑定事件。

我在代码中所做的是在更新面板的父元素上设置一个委托。更新时不会替换此父元素,因此事件绑定不受影响。

有很多很好的文章和插件可以用jQuery处理事件委托,这个特性很可能会加入到1.3版本中。我用来参考的文章/插件是:

http://www.danwebb.net/2008/2/8/event-delegation-made-easy-in-jquery

一旦您理解了发生了什么,我认为您会发现这是一个更优雅的解决方案,比每次更新后都记得重新绑定事件更可靠。这还有一个额外的好处,即在卸载页面时为您提供一个可以解绑定的事件。

其他回答

pageLoad = function () {
    $('#div').unbind();
    //jquery here
}

pageLoad函数非常适合这种情况,因为它在初始页面加载和每次updatepanel异步回发时运行。我只需要添加unbind方法,使jquery工作在updatepanel回发。

http://encosia.com/document-ready-and-pageload-are-not-the-same/

FWIW,我在使用mootools时也遇到了类似的问题。重新附加我的事件是正确的举动,但需要在请求结束时完成

var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function() {... 

如果beginRequest导致你得到空引用JS异常,请记住这一点。

干杯

对于在我的情况下的其他人,我试图让jquery文档准备函数为DevExpress ASPxCallbackPanel工作,上面没有(到目前为止)工作。这是对我有效的方法。

<script>
function myDocReadyFunction(){ /* do stuff */  }
</script>

<dx:ASPxCallbackPanel ID="myCallbackPanel" ... >
    <ClientSideEvents EndCallback="function(){ myDocReadyFunction();}"> 
    </ClientSideEvents>
    <PanelCollection ...>
</dx:ASPxCallbackPanel>

我也遇到过类似的问题,发现最好的方法是依靠事件冒泡和事件委托来处理它。事件委托的好处是,一旦设置好,就不必在AJAX更新后重新绑定事件。

我在代码中所做的是在更新面板的父元素上设置一个委托。更新时不会替换此父元素,因此事件绑定不受影响。

有很多很好的文章和插件可以用jQuery处理事件委托,这个特性很可能会加入到1.3版本中。我用来参考的文章/插件是:

http://www.danwebb.net/2008/2/8/event-delegation-made-easy-in-jquery

一旦您理解了发生了什么,我认为您会发现这是一个更优雅的解决方案,比每次更新后都记得重新绑定事件更可靠。这还有一个额外的好处,即在卸载页面时为您提供一个可以解绑定的事件。

我的答案吗?

function pageLoad() {

  $(document).ready(function(){

etc.

在许多其他解决方案都惨败的情况下,它就像一个魅力。