【问题标题】:Document.Ready() is not working after PostBack回发后 Document.Ready() 不起作用
【发布时间】:2021-01-23 23:31:03
【问题描述】:

我有一个包含更新面板中的用户控件的页面。 $(document).ready(function() ) { 在页面首次加载时被调用并正确执行代码,但如果用户单击按钮(在用户控件内),则不会调用 document.ready()document.loadonload 也不会工作)

我在网上对此进行了研究,发现了类似的问题,但没有什么可以解释为什么这不起作用。 document.ready 无法正常工作还有哪些其他原因?

【问题讨论】:

  • 这可能是几件事。有代码要分享吗?
  • Xyan 是对的,我发现另一个开发人员添加了一个检查 url 路径的子句,但 url 上的大小写被忽略,我的代码没有被访问。我建议向您的 JS 添加警报,以确保它不会被调用并从那里工作。

标签: c# javascript jquery asp.net user-controls


【解决方案1】:

这将是partial postback 的问题。 DOM 不会重新加载,因此不会再次触发文档就绪功能。您需要像这样在 JavaScript 中分配部分回发处理程序...

function doSomething() {
   //whatever you want to do on partial postback
}

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(doSomething);

上面对add_endRequest的调用应该放在页面第一次加载时执行的JavaScript中。

【讨论】:

  • 应该是Sys.WebForms.PageRequestManager.getInstance().add_endRequest(doSomething);
  • 'Sys.WebForms.PageRequestManager' 是 C# 还是 javascript?
  • 这是 Javascript - 这是加载的 Microsoft Ajax JS 库的例程
  • @aspdotnetuser 抱歉 - 那是因为我将 doSomething() 作为 add_endRequest 的参数 - 我相信 add_endRequest 只接受单个函数引用作为参数。显然,将doSomething() 作为参数会将doSomething 的返回值传递给add_endRequest...
  • BeginRequest 为我工作:window.Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(**Javascript function here **)
【解决方案2】:

你可以使用function pageLoad(){},而不是$(document).ready

它会被页面上的ScriptManager 自动调用,即使在回发时也是如此。

【讨论】:

  • 函数 pageLoad() 似乎没有做任何事情。
  • 您的页面上有<asp:ScriptManager runat="server" />
  • 是的,页面有一个ScriptManager
【解决方案3】:

正如 El Ronnoco 所说,我前段时间遇到过这个问题,它必须与 DOM 不重新加载有关。但是你可以简单地改变 $(document).ready(function() {

Sys.Application.add_load(function() {

这将强制它在每次回发时运行。

您也可以使用函数 pageLoad(),但您只能有一个 pageLoad 函数,而使用 Sys.Application.add_load,您可以添加任意数量的处理程序。

【讨论】:

  • 嗨,dcreight,在页面中添加以下内容:<asp:ScriptManager ID="ScriptManager1" runat="server"> <Scripts> <asp:ScriptReference Path="~/path/to/file.js" /> </Scripts> </asp:ScriptManager> 然后在外部文件(file.js)中,执行以下操作:Sys.Application.add_load(function() { //insert code here to do on every postback }); 使用 function pageLoad() {} 方法的问题在于您只能在页面中使用其中一个,而我上面的方法可以添加任意数量的 add_load 函数。如果仍有问题,请发送错误或示例代码。
  • 非常感谢! UpdatePanel 中的 jQueryUI Accordion 需要它。尝试了几个小时,直到我找到了这个。
【解决方案4】:

最好的办法是

<asp:UpdatePanel...
<ContentTemplate
     <script type="text/javascript">
                    Sys.Application.add_load(LoadScript);
     </script>
 you hemla code gose here 
</ContentTemplate>
    </asp:UpdatePanel>

Javascript 函数

<script type="text/javascript">

        function LoadScript() {
            $(document).ready(function() {

                   //you code gose here 
                                    });
         }
</script>

它在 UpdatePanel 下,而不是您需要使用再次注册客户端脚本

ScriptManager.RegisterClientScript

$(document).ready(function() {
    // bind your jQuery events here initially
});

var prm = Sys.WebForms.PageRequestManager.getInstance();

prm.add_endRequest(function() {
    // re-bind your jQuery events here
    loadscript();

});


$(document).ready(loadscript);

function loadscript()
{
  //yourcode 
}

【讨论】:

  • 你的意思是注册我要再次执行的javascript吗?
  • @aspdotnetuser - 是的,喜欢这个或者按照下面的答案中的建议,你可以轻松地做到这一点
【解决方案5】:

这是一个过去对我有用的例子:

<script>
function MyFunction(){ 
    $("#id").text("TESTING");
}
//Calling MyFunction when document is ready (Page loaded first time)
$(document).ready(MyFunction); 

//Calling MyFunction when the page is doing postback (asp.net)
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(MyFunction);
</script>

【讨论】:

    【解决方案6】:

    下面的代码很好地解决了这个问题。如之前发布的链接 (http://encosia.com/document-ready-and-pageload-are-not-the-same/) 所示,当您有一个带有 updatePanels 的 asp.NET 时,您应该使用函数 pageLoad()。当您只有一页并且在每次回发中将完全重新加载时, $(document).ready() 是正确的选择。

    使用 pageLoad 的示例:

        function pageLoad() {
    
            $(".alteraSoVirgula").keyup(function () {
                code here
            })
        }
    

    【讨论】:

    • 您的答案确实涉及与已提交的其他答案(以及已接受的答案)相同的一些想法,但它包含很多额外的绒毛,这些绒毛是您最初编写此代码的地方所特有的.为了获得对您的回答更积极的反馈,我建议删除与所问问题无关的任何内容,并添加关于为什么您的解决方案可以解决问题的解释。
    • 是的,做得很好。
    【解决方案7】:

    我也面临同样的问题,但我发现 jQuery $(document).ready 事件处理程序在页面加载时有效,但在 ASP.Net AJAX UpdatePanel Partial PostBack 之后它不会被调用。所以使用 Sys.Application.add_load(function(){});而不是 $(document).ready。 这对我来说非常有效:)

    <script>
    Sys.Application.add_load(function() { //Your code }); </script>

    【讨论】:

      【解决方案8】:
      $(document).ready(function () {
          PreRoles();
      });
      
      //On UpdatePanel Refresh
      var prm = Sys.WebForms.PageRequestManager.getInstance();
      if (prm != null) {
          prm.add_endRequest(function (sender, e) {
              if (sender._postBackSettings.panelsToUpdate != null) {
                  PreRoles();
              }
          });
      };
      
      function PreRoles() {
          // Add codes that should be called on postback
      }
      

      【讨论】:

        【解决方案9】:

        大多数情况下,这是因为 Updatepanle 的缘故。 只需将 回发触发器 放在按钮上,它就会解决这个问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-30
          • 1970-01-01
          • 2013-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-29
          相关资源
          最近更新 更多