每次刷新时都从更新面板内部执行javascript

时间:2011-05-17 00:04:04

标签: javascript asp.net ajax vb.net updatepanel

我有一个aspx页面,它由3个用户控件(ascx)组成。我有一个更新面板包装3个用户控件,如下所示:

<asp:UpdatePanel ID="UpdatePanelWrapper" runat="server">
    <ContentTemplate>
         <uc1:UserControl1 ID="UserControl1" runat="server" />        
         <uc2:UserControl2 ID="UserControl2" runat="server"/>
         <uc2:UserControl3 ID="UserControl3" runat="server"/>
    </ContentTemplate>
</asp:UpdatePanel>

我单独显示每个用户控件,因此当显示“UserControl1”时,其他2个用户控件将被隐藏。

在“UserControl1”里面我有一些asp控件和一些javascript函数。我的问题是,当刷新“UpdatePanelWrapper”时,永远不会调用这些javascript函数。

我已尝试过此解决方案http://blog.dreamlabsolutions.com/post/2009/02/24/jQuery-document-ready-and-ASP-NET-Ajax-asynchronous-postback.aspx,在“UserControl1”中添加了javascript调用,但它无效。只有当我在aspx页面中添加javascript调用但不在“UserControl1”中添加时,我才能使用它。

任何帮助将不胜感激,谢谢。

4 个答案:

答案 0 :(得分:11)

这是你怎么做的....

 <script type="text/javascript">

        Sys.Application.add_init(appl_init);

        function appl_init() {
            var pgRegMgr = Sys.WebForms.PageRequestManager.getInstance();
            pgRegMgr.add_endRequest(EndHandler);
        }

        function EndHandler() {
        // This will be called whenever your updatepanel update 
        // It will be trigger after the update updatepanel
        //add your javascript here
        }                                                          
    </script>  

答案 1 :(得分:1)

你可以使用

<强> Sys.Application.add_load(WireEvents); //修复.NET ajax updatepanel的接线

<script language="javascript" type="text/javascript">
// <![CDATA[
    Sys.Application.add_load(WireEvents); // fix wiring for .NET ajax updatepanel
    $(WireEvents); // handle page load wiring using jquery. This will fire on page load


    function WireEvents() {
               //do stuff here
    };
// ]]>
</script>
哦,还有一件事。请注意功能名称。否则它会变得一团糟。 试试这样的事情

<script language="javascript" type="text/javascript">
// <![CDATA[
    Sys.Application.add_load(WireEvents_<%=this.ID%>); // fix wiring for .NET ajax updatepanel
    $(WireEvents_<%=this.ID%>); // handle page load wiring


    function WireEvents_<%=this.ID%>() {

    };// end WireEvents_


// ]]>
</script>

所以基本上将_<%=this.ID%>添加到funciton名称可确保控件的每个实例都调用它自己的函数。假设您可以拥有控件的多个实例。如果不是,它至少可以防止在为不同控件调用wireevents时产生混淆

答案 2 :(得分:1)

不评估UpdatePanel响应中返回的脚本。如果我理解正确,您可以执行一些在UpdatePanel视图中返回的脚本操作。

如果是,我在这里回答了这个问题:

asp.net eval script in ajax html reponse

答案 3 :(得分:0)

理想情况下,您的所有JavaScript都应该在结束</body>标记之前位于页面底部。

如果您使用的是jQuery,则需要使用 live() delegate() 来确保这些事件处理程序冒泡,即使页面会刷新。