【问题标题】:pageLoad() not firing in a dynamically loaded page using .NET 4.0 (Works fine on 3.5)pageLoad() 未在使用 .NET 4.0 的动态加载页面中触发(在 3.5 上运行良好)
【发布时间】:2012-07-18 14:09:41
【问题描述】:

我有一个简单的 aspx 页面,其中包含在右侧 div 上加载另一个 aspx 页面的链接(使用 JQuery 加载),如下所示:

<%@ Page Title="Home Page" Language="C#"  AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<html>
<head>
   <script type="text/javascript" src="Scripts/jquery-1.6.2.js"></script>
</head>
<body>
<form id="form1" runat="server">

    <script type="text/javascript">
        function loadPage() {
            $('#myRightdiv').load('Test.aspx', function () {});
        }
    </script>

 <asp:Button ID="Button1" runat="server" Text="Load ..." OnClientClick="loadPage(); return false;" />
 <div id="myRightdiv"></div>
 </form>

在我的 Test.aspx 中,我有一个这样的 pageLoad:

<%@ Page Title="Test" Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="About" %>

<html>
<head id="Head1" runat="server">
  <title></title>
</head>
<body>
<form id="form1" runat="server">
  <asp:ScriptManager ID="ScriptManager1" runat="server" />
  <script type="text/javascript">
    function pageLoad() {          
       alert("pageloaded");
    }        
  </script> 

</form>
</body>
</html>

这在 ASP .NET 3.5 上运行良好 .... 但是使用 .NET 4.0 不会触发 pageLoad!

有什么想法或解决方法吗?

谢谢

【问题讨论】:

  • 生成的 HTML 源代码(而不是 ASP.net 源代码)会更有用(因为这是一个 JavaScript 问题)。
  • 哪个pageLoad 没有被解雇?主页中的那个还是Test.aspx中的那个?
  • 从我在Test.aspx 的源代码中可以看到,没有任何东西触发pageLoad 函数。例如,一种方法是&lt;body onload="pageLoad()"&gt;,或等效的 ASP.net,但您似乎没有定义这样的属性。比较 3.5 和 4.0 中的源代码,并检查 3.5 中是否存在某些“onload”属性。
  • 我不需要定义它...正如我所说,它是一个 .NET 快捷方式,适用于 .NET 3.5...在 .NET 4.0 中发生了一些变化...
  • 贴出Test.aspx生成的HTML源码。 (只需在单独的浏览器选项卡中加载 Test.aspx,右键单击它,然后选择“查看源代码”)。通过检查生成的源代码,我们将能够判断pageLoad 函数是否被正确调用。

标签: jquery asp.net


【解决方案1】:

当 Microsoft Ajax 库完成对 Sys.Application 对象的初始化后,将调用特殊的 pageLoad 函数。不幸的是,这个初始化代码在 ASP.NET 4.0 中被彻底重写(详情如下),现在,在符合标准的浏览器中,当页面被 jQuery load 函数加载时,Sys.Application 根本不会被初始化。幸运的是,有一个简单的解决方法:自己初始化Sys.Application

$('#myRightdiv').load('Test.aspx', function () { Sys.Application.initialize(); });

我在 IE9(标准模式)、Firefox 和 Chrome 中测试了此修复程序。

要让您的示例在 IE9(Quirks 模式)下运行,您还需要将 pageLoad 函数向上移动到 &lt;head&gt;

ASP.NET 3.5 和 ASP.NET 4.0 之间发生了什么变化

在 ASP.NET 3.5 中,&lt;asp:ScriptManager&gt; 控件在 &lt;/form&gt; 标记之前插入对 Sys.Application.initialize() 的调用。当 jQuery 加载 Test.aspx 时,它会依次执行每个 &lt;script&gt;,因此您的 pageLoad 是在 Sys.Application.initialize() 调用它之前定义的,一切正常。

在 ASP.NET 4.0 中,&lt;asp:ScriptManager&gt; 控件不再插入该位 JavaScript。而是:

  • 在支持document.addEventListener [例如 IE9(标准模式)、Firefox 和 Chrome] 的浏览器中,Sys.Application 构造函数添加了一个调用 Sys.Application.initialize()DOMContentLoaded 事件侦听器。但是DOMContentLoaded 已经在浏览器完成加载 current 页面(Default.aspx)时引发。通过 AJAX 请求加载 Test.aspx 不会导致浏览器重新引发 DOMContentLoaded

  • 在支持 document.attachEvent 但不支持 document.addEventListener [例如 IE9(Quirks 模式)] 的浏览器中,如果浏览器已完成加载当前页面(它具有, 因为当前页面是 Default.aspx)。在这种情况下,您需要定义您的pageLoad 函数之前 MicrosoftAjax.js 被包含;一个好地方是&lt;head&gt;

【讨论】:

  • 太棒了!所以 catch 是调用 intialize() 并将 pageLoad 函数移动到 以便它可以在 IE 9 标准模式和 quirks 模式下工作。奇迹般有效!今天学到了新东西。 :)
【解决方案2】:

有时当您调用未完全加载的目标页面时,您将调用 pageload 方法,它不会应用于它,因此您必须在页面完全加载后调用

所以你可以在 Test.aspx 页面中做一些简单的解决方案,如下所示:

<asp:ScriptManager ID="ScriptManager1" runat="server" />
  <script type="text/javascript">
    function pageLoad() {          
       alert("pageloaded");
    }        

    pageLoad(); //invoke pageLoad immediately
  </script> 

与 3.5 和 4.0 相关的另一个原因我认为 4.0 中加载脚本管理器的处理时间更高。

【讨论】:

  • 谢谢,但是如果我手动调用它,我将失去 pageLoad 的含义并且无法解决我的问题(我需要一个仅在 pageLoad 上可用的 Telerik 组件)
【解决方案3】:

您可能想尝试在 pageLoad 之前引发的 Sys.Application.add_load(handler),更多信息请查看this

如文档中提到的here 所述,pageLoad 似乎没有任何变化。如果您没有对部分回发执行任何操作,那么您也可以使用 window.onload。

如果你只是检查是否收到响应成功,你可以使用Jquery.load()的回调函数

【讨论】:

  • Sys.Application.add_load 也不起作用...您可以轻松复制您希望的问题...
  • 你是对的,它不适用于 .net 4.0,但使用 .net 3.5 可以正常工作。但是对于 .net 4.0,如果我将 IE 浏览器模式从 IE9 更改为 IE8,如果我继续,它会显示消息,很奇怪
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2011-11-08
  • 1970-01-01
相关资源
最近更新 更多