4

我有一个简单的 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!

任何想法或解决方法?

谢谢

4

3 回答 3

7

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

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

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

要让您的示例在 IE9(Quirks 模式)下工作,您还需要将您的pageLoad函数向上移动到<head>.

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

在 ASP.NET 3.5 中,控件在标记之前<asp:ScriptManager>插入一个调用。当 jQuery 加载 Test.aspx 时,它会按顺序执行每个,因此在调用它之前定义了你的,并且一切正常。Sys.Application.initialize()</form><script>pageLoadSys.Application.initialize()

在 ASP.NET 4.0 中,<asp:ScriptManager>控件不再插入该位 JavaScript。反而:

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

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

于 2012-07-29T20:32:59.647 回答
0

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

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

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

于 2012-07-25T10:36:07.527 回答
0

有时,当您调用未完全加载的目标页面时,您将调用 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 中加载脚本管理器的处理时间更高。

于 2012-07-23T20:01:40.573 回答