Jquery pageLoad()在使用.NET 4.0动态加载的页面中不触发(在3.5上工作正常)

Jquery pageLoad()在使用.NET 4.0动态加载的页面中不触发(在3.5上工作正常),jquery,asp.net,Jquery,Asp.net,我有一个简单的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="S

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

函数loadPage(){
$('#myRightdiv').load('Test.aspx',function(){});
}

在我的Test.aspx中,我有这样一个页面负载:

<%@ 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>
<%@ 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>

函数pageLoad(){
警报(“页面加载”);
}        
这在ASP.NET3.5上运行良好。。。。但是使用.NET4.0不会触发页面加载

有什么想法或解决办法吗


谢谢

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

因此,您可以在Test.aspx页面中执行以下简单解决方案:

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

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

函数pageLoad(){
警报(“页面加载”);
}        
页面加载()//立即调用pageLoad

另一个原因与3.5和4.0有关,我认为在4.0中加载scriptmanager需要更长的处理时间。

您可能需要尝试Sys.Application.add_load(handler),它在页面加载之前引发,有关更多信息,请查看

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


如果您只是检查是否已成功接收响应,则可以使用

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

$('#myRightdiv').load('Test.aspx', function () { Sys.Application.initialize(); });
我在IE9(标准模式)、Firefox和Chrome中测试了这个补丁

要使示例在IE9(怪癖模式)下工作,还需要将
pageLoad
函数向上移动到

ASP.NET 3.5和ASP.NET 4.0之间发生了什么变化 在ASP.NET 3.5中,
控件在
标记的正前方插入对
Sys.Application.initialize()的调用。当jQuery加载Test.aspx时,它会按顺序执行每个
,因此在
Sys.Application.initialize()调用它之前定义
pageLoad
,一切正常

在ASP.NET 4.0中,
控件不再插入JavaScript。相反:

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

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


生成的HTML源代码(而不是ASP.net源代码)会更有用(因为这是一个JavaScript问题)。哪个
pageLoad
不会被触发?主页上的那一个还是Test.aspx中的那一个?从我在Test.aspx的源代码中可以看到,没有任何东西触发
pageLoad
功能。例如,一种方法可能是
,或者是ASP.net的等效方法,但您似乎没有定义这样的属性。比较3.5和4.0中的源代码,检查3.5中是否存在“onload”属性。我不需要定义它。。。正如我所说,这是一个.NET快捷方式,可以与.NET3.5配合使用。。。NET 4.0中发生了一些变化…发布Test.aspx生成的HTML源代码。(只需在单独的浏览器选项卡中加载Test.aspx,右键单击它,然后选择“查看源代码”)。通过检查生成的源代码,我们将能够判断是否正确调用了
pageLoad
函数。谢谢,但是如果我手动调用它,我将失去pageLoad的含义,并且无法解决我的问题(我需要一个仅在pageLoad上可用的telerik组件)Sys.Application.add\u load也不起作用。。。你可以很容易地复制你想要的问题……你是对的,它不适用于.net 4.0,但适用于.net 3.5,它可以毫无问题地工作。然而,对于.NET4.0,如果我将IE浏览器模式从IE9更改为IE8,并且如果我继续,它将显示消息“怪诞棒极了!”!所以catch是调用initalize()并将pageLoad函数移动到,这样它就可以在IE9标准模式和怪癖模式下工作。工作起来很有魅力!今天学到了一些新东西