UpdatePanel 异步回发后的 Javascript 事件订阅

Posted

技术标签:

【中文标题】UpdatePanel 异步回发后的 Javascript 事件订阅【英文标题】:Javascript event subscription after UpdatePanel async postback 【发布时间】:2011-09-05 11:51:03 【问题描述】:

在 asp.net 页面上异步回发后,jquery 事件处理程序出现问题。 我读了this topic - 这是一个很好的解决方案,但我需要一个单独的函数。 所以我使用jquery masked plugin。

我的 js 代码现在是:

<script type="text/javascript">

jQuery(document).ready(function () 
  var control = $("#txtCustomerPhone");

  InitPhonePattern(this, control);

  var prm = Sys.WebForms.PageRequestManager.getInstance();
  prm.add_endRequest(InitPhonePattern(this, control));
 );

 function InitPhonePattern(sender, args) 
  $(args[0]).mask("+7 (999) 999-99-99",  completed: 
    function () 
    $('#btnCheckCustomerPhone').click(); 
  );


</script>

如您所见,掩码被初始化了 2 次:在文档 Ready() 上和异步回发之后(在 endRequest() 上)。但是屏蔽插件在异步回发后没有映射。

有人了解问题吗?我将不胜感激!

【问题讨论】:

【参考方案1】:

你代码中的问题是 jQuery(document).ready 在更新面板之后没有运行,所以你需要让你的 endRequest 脱离 jQuery。

试试这个方法:

<script type="text/javascript">
        var prm = Sys.WebForms.PageRequestManager.getInstance();    
        prm.add_initializeRequest(InitializeRequest);
        prm.add_endRequest(EndRequest);

        function InitializeRequest(sender, args)       
        

        function EndRequest(sender, args) 
             Init();
        

        jQuery(document).ready(function()Init(););

        function Init()
        
          var control = $("#txtCustomerPhone");
          InitPhonePattern(control);        
        

        function InitPhonePattern(args) 
            $(args[0]).mask("+7 (999) 999-99-99",  completed: 
            function () 
               $('#btnCheckCustomerPhone').click(); 
            );
        
</script>

【讨论】:

Aristos,谢谢 - 但现在我有以下客户端错误:“未定义系统” 哎呀,为了在上面使用 Sys.WebForms.PageRequestManager,必须放置 ScriptManager - 我在我的问题中修复了代码【参考方案2】:

我想感谢Aristos 的帮助和正确的方向! 在你的代码中,我只修复了这个字符串:

jQuery(document).ready(Init);//direct transfer function not work;

所以最终代码如下所示:

<script type="text/javascript">
     var prm = Sys.WebForms.PageRequestManager.getInstance();
     prm.add_endRequest(EndRequest);

     function EndRequest(sender, args) 
         Init();
     

     $(document).ready(function () 
         Init();
     );

     function Init() 
         var control = $('#txtCustomerPhone');
         InitPhonePattern(control);
     

     function InitPhonePattern(args) 
         $(args).mask("+7 (999) 999-99-99",  completed:
            function () 
                $('#btnCheckCustomerPhone').click();
            
         );
    

</script>

【讨论】:

以上是关于UpdatePanel 异步回发后的 Javascript 事件订阅的主要内容,如果未能解决你的问题,请参考以下文章

jquery datepicker ms ajax updatepanel在回发后不起作用

回发后的 MVC3 RedirectToAction

从更新面板异步回发后保持滚动位置

在每次 JSF ajax 回发后执行 JavaScript

回发后丢失 Bootstrap CSS

回发后jQuery将DatePicker日期文本保留到文本框中