更新面板后调用Javascript函数的问题

16

我在我的UpdatePanel中有一个文字,它根据代码后台中的一个方法生成一个Javascript数组。

当加载页面内容时,我没有问题。但是,如果我尝试执行搜索以更新UpdatePanel内的Javascript数组文字,我发现在Javascript已经启动之后,文字会在postback之后更新。

以下是我拥有的基本示例:

<script type="text\javascript">
function BindMyFunction(itemList)
{
    //Do something
}
</script>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>  
<!-- Literal containing generated JS array -->
    <asp:Literal ID="ProfileJavscriptOutput" runat="server"></asp:Literal> 
    <ul id="person-search">
    <li><asp:TextBox ID="TxtFirstname" runat="server" Text=""></asp:TextBox></li>
    <!-- Update Literal onClick -->
        <li><asp:ImageButton CssClass="searchbtn" ID="ImageButton1" runat="server" OnClick="ImageButton1_Click" /></li>
    </ul>    
    <!-- Some jCarousel rendered -->
</asp:UpdatePanel>

我一直在查看以下帖子:

ASP.NET - UpdatePanel和JavaScript

在UpdatePanel后回发后调用JavaScript

但我似乎无法正确地将其应用到我的代码中。

当我不使用UpdatePanel时,它可以正常工作。 但这是一个要求,以便在执行搜索时页面位置不会移动。


代码看起来之前是什么样子的?之后又是什么样子的? - Russ Cam
当完整页面加载时,JavaScript 是如何被调用的? - Karl Nicoll
11
你的母亲从没告诉过你更新面板很糟糕吗? - The Muffin Man
1
@Nick 是的,我知道。哈哈!但这是我想到在SharePoint中进行PostBack而不刷新页面的唯一方法。 - R100
它确实会刷新页面,就像一个post back一样,只是您在视觉上无法看出来(除了响应速度不如真正的AJAX调用)。 - The Muffin Man
3个回答

26

您可以在Page_Load事件中添加以下代码:

ScriptManager.RegisterStartupScript(Me.rptGridAlbum, rptGridAlbum.GetType, "scriptname", "somejavascript", True)
这将在 AJAX 回调后触发您网页上的 JavaScript。 MSDN

没错,它起作用了。我基本上在获取初始数据时调用了ScriptManager.RegisterStartupScript,然后在执行搜索以更新Javascript时再次调用了它。 - R100
20
很遗憾没有更好的解释来阐述这些论点,否则这个答案可能会有更多的赞同票。 - Serj Sagan
2
如果您想包含整个JavaScript文件,请注意第四个参数不是文件路径,而是实际的JavaScript内容。您可以执行类似于File.ReadAllText(Server.MapPath("~/Virtual/Path/To/File.js"))的操作。 - TJB
1
虽然这样可以工作,但是在多次调用后似乎会导致生成的文档中逐渐增加了不必要的脚本冗余。然而,在这里有另一个想法。 - StuartLC

0
var prm = Sys.WebForms.PageRequestManager.getInstance();
if (prm != null) {
    prm.add_endRequest(function (sender, e) {
        if (sender._postBackSettings.panelsToUpdate != null) {
            DisplayCurrentTime(); // here your javascript function
        }
    });
};

0
您可以创建一个简单的 Web 服务方法,每当需要时返回 JavaScript 数组到页面,并将对该 Web 服务的调用封装在 JavaScript 方法中。在浏览器端调用 JavaScript 方法以刷新内存中的数组比期望在 UpdatePanel 回发中再次解析 JS 数组文字更有效。

在UpdatePanel回发时更新JS数组,最好使用ScriptManager.RegisterArrayDeclaration来完成。 - Abel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接