我在IE8中的UpdatePanel中选择TextBox内的文本时遇到问题。考虑一个包含单个UpdatePanel的非常简单的页面。内的UpdatePanel有两个Web控件:在部分页面回发后选择UpdatePanel中的ASP.NET文本框的内容
- 一个DropDownList有三个静态定义列表项,其AutoPostBack属性设置为True,并
- 一个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();然后TextBox接收焦点(尽管文本未被选中)。我已检查了MicrosoftAjaxWebForms.js的内容,并注意到注册脚本运行后焦点已设置,但我的JavaScript技能还不足以解码此处发生的一切,以及为什么选择的文本未被选中在它被选择的时间和部分页面回发的结束之间。我也尝试过使用Firebug的JavaScript调试器,并发现当我的脚本运行时,TextBox的文本被选中。当我继续浏览它时,文本仍然处于选中状态,但是在踩下脚本的最后一行(显然)后,突然间它被取消选中。
任何想法?我正在拉我的头发。
在此先感谢...
编辑:在进一步的测试我注意到,在火狐,Chrome或Safari测试时这种行为只发生在IE 8.它不发生...
感谢您的指导。我最终做了类似的事情,而且这个伎俩。再次感谢... – 2010-05-26 21:31:44