2010-07-07 14 views
3

我有一个带有中继器的UpdatePanel,它在用户通过模式弹出窗口添加项目后重新绑定。我的UpdatePanel完成加载DOM元素后,如何从代码隐藏中执行JavaScript?

当他们点击按钮,一个新的行添加到中继器的代码隐藏看起来是这样的:

protected void lbtnAddOption_Click(object sender, EventArgs e) 
{    
    SelectedOption = new Option() 
    { 
     Account = txtAddOptionAccountNumber.Text, 
     Margin = chkAddOptionMargin.Checked, 
     Symbol = txtAddOptionSymbol.Text, 
     Usymbol = txtAddOptionUsymbol.Text, 
    }; 

    Presenter.OnAddOption(); // Insert the new item 
    RefreshOptions(); // Pull down and re-bind all the items 
    mpeAddOptionDialog.Hide(); // Hide the modal 

    // ... Make call to jQuery scrollTo() method here? 

} 

这工作正常,并在新行会很快出现通过的UpdatePanel。

但是,通常有数百行,添加新行的地方是基于当前使用的排序列。

所以,我想把这当作一个机会来使用甜美的jQuery ScrollTo plugin。我知道,如果我将溢出的容器div的ID和其中元素的ID赋予它,它将平滑地直接滚动到用户新添加的行。

但是,这里有两个问题:

  1. 我需要找到适当的行,所以我可以嵌入ClientID的吧。
  2. 我需要从我的代码隐藏执行jQuery代码片段,这将导致我的新更新的中继器滚动到正确的行。

我已经解决了#1。我有一个可靠的方法,将产生新添加的行的ClientID。

然而,问题#2被证明是棘手的。我知道我可以直接拨打ScriptManager.RegisterStartupScript()作为我的代码后台,它会执行我的页面上的JavaScript。

我遇到的问题是它似乎在执行那段JavaScript之前(我猜测)新刷新的DOM元素已完全加载。所以,尽管我传递了适当的jQuery代码来滚动到我想要的元素,但它对我来说是错误的,因为它无法找到该元素。

这里是我使用的方法结束时,我张贴以上行:

 string clientID = getClientIdOfNewRow(); 
    ScriptManager.RegisterStartupScript(this, typeof(Page), "ScrollScript", String.Format("$(\"#optionContainer\").scrollTo(\"{0}\", 800);", clientID), true); 

什么我需要做的,所以我可以保证这条线的JavaScript不叫,直到使用UpdatePanel的页面真的准备好了吗?

+0

您是否尝试添加$(document).ready(function(){//如果适当的话,在这里运行您的滚动});到你的页面的头部(你的页面的一部分在updatepanel之外)?那可能会做你所需要的 – Tahbaza 2010-07-07 04:05:45

回答

0

您可以使用Sys.Application.load事件,该事件在加载所有脚本并创建并初始化应用程序中的对象后引发。

所以,你的代码是:

string clientID = getClientIdOfNewRow();   
ScriptManager.RegisterStartupScript(this, typeof(Page) 
    ,"ScrollScript" 
    ,String.Format("Sys.Application.add_load(function(){{$(\"#optionContainer\").scrollTo(\"{0}\", 800);}});" 
    , clientID) 
    , true); 
1

如果你需要处理的东西是在更新面板,那么你需要一旦面板被加载运行您的JS。我使用add_endRequest。这下面是从更复杂的东西黑。它在准备好的文档上运行一次,但安装每次更新面板更新时触发的“结束ajax”处理程序。到它发生的时候,它就在你身边。

​​

显然你可以从代码隐藏注入,如果你想。

相关问题