繁体   English   中英

在部分页面回发之后,在UpdatePanel中选择ASP.NET TextBox的内容

[英]Selecting the contents of an ASP.NET TextBox in an UpdatePanel after a partial page postback

我在选择IE 8的UpdatePanel中的TextBox中的文本时遇到问题。请考虑一个非常简单的页面,其中包含一个UpdatePanel。 在该UpdatePanel中,有两个Web控件:

  1. 具有三个静态定义的列表项的DropDownList,其AutoPostBack属性设置为True,以及
  2. TextBox Web控件

DropDownList的SelectedIndexChanged事件具有服务器端事件处理程序,在该事件处理程序中有两行代码:

TextBox1.Text = "Whatever";
ScriptManager.RegisterStartupScript(this, 
                      this.GetType(), 
                      "Select-" + TextBox1.ClientID,
                      string.Format("document.getElementById('{0}').select();", 
                                                       TextBox1.ClientID), 
                      true);

这个想法是,每当用户从DropDownList中选择项目时,都会有部分页面回发,这时将设置和选择TextBox的Text属性(通过注入的JavaScript)。 不幸的是,这不能按原样工作。 (我也尝试过将脚本放到pageLoad函数中,但是没有运气,如: ScriptManager.RegisterStartupScript(...,“ function pageLoad(){... my script ...}”“); )发生的是代码会运行,但是页面上的其他内容会集中在部分页面回发的结束上,从而导致未选择TextBox的文本。

我可以使用JavaScript的setTimeout来“修复”此问题,以延迟执行我的JavaScript代码。 例如,如果我将发出的JavaScript更新为以下代码:

setTimeout("document.getElementById('{0}').select();", 111);

有用。” 我将作品用引号引起来,因为它适用于计算机上的此简单页面。 在速度较慢的计算机上的更复杂的页面上,通过部分页面回发在客户端和服务器之间传递了更多的标记,我必须将超时延长到一秒钟以上才能使其正常工作。 我希望有一个更简单的方法来实现这一目标。 与其说“延迟X毫秒”,不如说“当您不打算窃取焦点时运行此命令”。

令人困惑的是.Focus()方法的效果很好。 也就是说,如果我取消JavaScript并将其替换为对TextBox1.Focus()的调用 然后文本框将获得焦点(尽管未选择文本)。 我检查了MicrosoftAjaxWebForms.js的内容,发现焦点已在运行已注册的脚本之后设置,但是我的JavaScript技能不足以解码此处发生的一切以及为什么在文本之间未选择所选文本的原因。时间被选中,部分页面回发结束。 我还尝试使用Firebug的JavaScript调试器,并看到当我的脚本运行时,选择了TextBox的文本。 当我继续浏览时,文本仍然保持选中状态,但是在退出脚本的最后一行(显然)之后,突然之间所有内容都未被选择。

有任何想法吗? 我正在拔头发。

提前致谢...

编辑:经过进一步测试,我注意到此行为仅在IE 8中发生。在Firefox,Chrome或Safari中进行测试时不会发生。

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
        function(sender, args) {
            document.getElementById('TextBox1.ClientID').focus();
        });

UpdatePanel完成请求后,将调用此方法。 您还需要从DOM中重新拉动元素,因为在调用更新面板之前对它的任何引用都不会在更新面板完成后指向该字段。

我没有使用UpdatePanel太多,因此对于这在您的特定情况下是否有用没有多少了解,但是使用jQuery document.ready包装器成功解决了焦点难题。 如果您尚未使用jQuery,则可能值得进行测试-尝试更改RegisterStartupScript以输出以下内容:

$(document).ready(function() {
    document.getElementById('TextBox1.ClientID').select();
});

当然,可能会有非jQuery的方式对此进行排序,但是这种方法通常使它变得简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM