2010-05-19 75 views
1

我在IE8中的UpdatePanel中选择TextBox内的文本时遇到问题。考虑一个包含单个UpdatePanel的非常简单的页面。内的UpdatePanel有两个Web控件:在部分页面回发后选择UpdatePanel中的ASP.NET文本框的内容

  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();然后TextBox接收焦点(尽管文本未被选中)。我已检查了MicrosoftAjaxWebForms.js的内容,并注意到注册脚本运行后焦点已设置,但我的JavaScript技能还不足以解码此处发生的一切,以及为什么选择的文本未被选中在它被选择的时间和部分页面回发的结束之间。我也尝试过使用Firebug的JavaScript调试器,并发现当我的脚本运行时,TextBox的文本被选中。当我继续浏览它时,文本仍然处于选中状态,但是在踩下脚本的最后一行(显然)后,突然间它被取消选中。

任何想法?我正在拉我的头发。

在此先感谢...

编辑:在进一步的测试我注意到,在火狐,Chrome或Safari测试时这种行为只发生在IE 8.它发生...

回答

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

这将在UpdatePanel完成请求后调用。您还需要从DOM重新提取元素,因为在更新面板调用之前对其的任何引用都不会指向更新面板完成后的字段。

+0

感谢您的指导。我最终做了类似的事情,而且这个伎俩。再次感谢... – 2010-05-26 21:31:44

2

我还没有使用UpdatePanel太多,所以不太了解这是否在您的特定情况下有任何用处,但是使用jQuery document.ready包装器已成功解决了焦点问题。如果你不使用jQuery已经它可能是值得一试 - 尝试改变的RegisterStartupScript输出是这样的:

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

当然也有可能是非jQuery的方式来解决这,但这种方法通常变得非常简单。

+0

callcopse,我测试了你的建议,使用Firefox,它的工作!然后,我尝试了我以前的尝试(在Firefox中),即将代码直接放入RegisterStartupScript中,放入pageLoad中,并使用setTimeout(全部三种)。我发现它在FF中适用于所有三种情况。 呃哦。 因此,我启动了IE 8,这是我昨天用于测试的结果,并且这三种方法都没有在IE 8中工作。所以我们又回到了第一个方法,但是提供了更多信息。 (我已更新原始问题以包含此附加信息...) – 2010-05-20 15:25:57

相关问题