1

我有一个 UpdatePanel,我用它来替换页面内的内容。在 UpdatePanel 之外,我有一些 jQuery 使用该on()函数来分配一些按钮点击。据我了解,新的 jQuery.on() 语法旨在替换事件处理程序和旧live()功能。该live()函数应该监视页面的更改并将事件附加到添加到页面的任何元素,但是on()在我的测试页面中的函数不会发生这种情况。如果我在 UpdatePanel 更改后打开控制台并运行相同的功能,则事件处理程序可以正常工作。

这是我有 javascript 明智的:

$(function () {
    $('.results').on('click', function () {
        $(this).children('.explination').slideToggle();
    });
});

UpdatePanel 是一个简单的 UpdatePanel,其中包含一个 MultiView。

我知道我可以使用 Microsoft AjaxPageRequestManager来处理这个问题,但如果事件像我相信的那样绑定,它似乎应该是不必要的。我现在将使用它,但我很好奇我是否做错了,或者 jQuery 和 ASP.Net 是否不能一起工作。

我的一个理论是,无论出于何种原因,UpdatePanel 都无法触发 jQuery 用来捕获更改并再次触发 on 事件的 DOM 更新触发器。

4

2 回答 2

6

诀窍是使用委托事件。引用 jQuery 文档:

委托事件的优点是它们可以处理来自以后添加到文档的后代元素的事件。通过选择在附加委托事件处理程序时保证存在的元素,您可以使用委托事件来避免频繁附加和删除事件处理程序的需要。

要使用委托事件,请将选择器作为第二个参数传递,例如:

$('html').on('click', '.results', function () {
    $(this).children('.explination').slideToggle();
});
于 2012-06-18T12:29:57.383 回答
1

我讨厌更新面板……呃。也许尝试这样的事情:

DOM:

<asp:UpdatePanel runat="server"><ContentTemplate>
  <MultiView>...</MultiView>
  <script>
    var prm = Sys.WebForms.PageRequestManager.getInstance(); 
    prm.add_endRequest(function() {
        ready();
    });
    </script>
 </ContentTemplate></asp:UpdatePanel>

Jquery-ness:

 $(document).ready(function(){
        ready();
    });

    function ready(){
      $('.results').on('click', function () {
         $(this).children('.explination').slideToggle();
      });
    }
于 2012-06-18T12:30:08.087 回答