我有一个带有中继器的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赋予它,它将平滑地直接滚动到用户新添加的行。
但是,这里有两个问题:
- 我需要找到适当的行,所以我可以嵌入ClientID的吧。
- 我需要从我的代码隐藏执行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的页面真的准备好了吗?
您是否尝试添加$(document).ready(function(){//如果适当的话,在这里运行您的滚动});到你的页面的头部(你的页面的一部分在updatepanel之外)?那可能会做你所需要的 – Tahbaza 2010-07-07 04:05:45