输入焦点的问题,已经触发 onfocus(),怎么光标不在上面?

catman3000 2009-02-26 04:33:10
输入框绑定了 onfocus 事件,已经触发,但光标不在上面,好像在页面的其它地方似的,鼠标点击页面的空白部分,光标也不回来。

用 setTimeout() 函数延迟了 N 秒,然后再执行输入框的 onfocus() 函数,光标还是没有上去。(有时候上去,有时候又没有上去)

我用了 Ajax,出现这种情况,都是在 Ajax 返回结果的时候,后台页面如果执行时间稍长一些的时候,就会出现这种情况。我知道要用 setTimeout 函数
延迟一下再设置焦点,但没有用。

大家讨论一下,可能会是什么原因?

在 Ajax 版的帖子:
http://topic.csdn.net/u/20090219/18/ddd8bafa-6f90-4d4f-a78e-5edc96c7de1a.html
...全文
485 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm4242 2009-03-02
  • 打赏
  • 举报
回复
呵呵,找到方法就好,我也学会了,哈哈
catman3000 2009-03-02
  • 打赏
  • 举报
回复
找到办法了,不用 JS 的设置焦点,而调用 AJAX 类库中的设置焦点函数:
ScriptManager1.SetFocus(tbDebug);
catman3000 2009-03-02
  • 打赏
  • 举报
回复
另外,延迟时间设置为5秒,一样会出现焦点设置不上去的问题。
catman3000 2009-03-02
  • 打赏
  • 举报
回复
如果 AJAX 没有执行完就设置了焦点,按说也不会没有聚焦成功啊,而是聚焦后又丢失焦点,但看效果,没有一次是聚焦后丢失焦点。
如果延迟2000,仔细看按钮,能看出来在2秒时,按钮有些小变化,好像鼓起来了,由此可见这时候焦点确实设置了,好像是设置到了页面的其它地方,修改了代码更清楚地看效果。

这个 AJAX 控件还必须得用,整个框架都用了这个 AJAX,页面比较复杂,自己写 JS 要累死。


<%@ Page Language="C#" AutoEventWireup="true" Title="Untitled Page" %>
<%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TagPrefix="asp" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head id="Head1" runat="server" />
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>

<center>
<form id="form1" runat="server" >
<asp:ScriptManager ID="ScriptManager1" runat="server" EnableScriptGlobalization="true" />

<asp:updatepanel ID="UpdateMainPanel" runat="server" UpdateMode="conditional">
<ContentTemplate>
<asp:TextBox runat="server" ID="TextBox1" ></asp:TextBox><br />
<asp:TextBox runat="server" ID="tbDebug" ></asp:TextBox><br />
<asp:button runat="server" id="btn" text="测试焦点" OnClick="btn_Click" />
<br />
点击空白区域,再点击测试焦点按钮,失去焦点的几率提高很多。
</ContentTemplate>
</asp:updatepanel>
</form>
</center>

<script runat="server" type="text/C#">
protected void Page_Load(object sender, EventArgs e)
{
tbDebug.Text = "Load:" + DateTime.Now.ToString();
tbDebug.Attributes.Add("onfocus", "document.getElementById('tbDebug').value='focus:" + DateTime.Now.ToString() + "'"); //焦点设置上后弹出提示窗口
}
protected void btn_Click(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(1000); //如果不延迟,基本上都能设置焦点成功

ScriptManager.RegisterStartupScript(this, this.GetType(), "OOKK"
, "setTimeout(\"document.getElementById('" + tbDebug.ClientID + "').focus();\",2000);" , true);
tbDebug.Text = "Clickd:" + DateTime.Now.ToString();
}
</script>

</body>
</html>

lm4242 2009-02-27
  • 打赏
  • 举报
回复
最好把代码简化一下贴出来,试试帮你调一下
lm4242 2009-02-27
  • 打赏
  • 举报
回复
试了一下,如果时间设长点肯定能获得焦点,5000以上吧,
聚焦的脚本是肯定会执行的,导致最终没有聚焦的原因估计是ajax还没执行完就focus了,后来又执行了其他脚本,使焦点丢失
这个控件的工作原理不懂啊,代码倒是开源,但自己改估计很费劲,
如果想很好的实现页面的一些特效还是自己写纯脆的js代码吧,那样更好控制,也好找原因,感觉这套ajax控件很花哨但不实用
catman3000 2009-02-27
  • 打赏
  • 举报
回复
代码如下:

<%@ Page Language="C#" AutoEventWireup="true" Title="Untitled Page" %>
<%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TagPrefix="asp" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head id="Head1" runat="server" />
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>

<center>
<form id="form1" runat="server" >
<asp:ScriptManager ID="ScriptManager1" runat="server" EnableScriptGlobalization="true" />

<asp:updatepanel ID="UpdateMainPanel" runat="server" UpdateMode="conditional">
<ContentTemplate>
<asp:TextBox runat="server" ID="TextBox1" ></asp:TextBox><br />
<asp:TextBox runat="server" ID="tbDebug" ></asp:TextBox><br />
<asp:button runat="server" id="btn" text="测试焦点" OnClick="btn_Click" />
<br />
点击空白区域,再点击测试焦点按钮,失去焦点的几率提高很多。
</ContentTemplate>
</asp:updatepanel>
</form>
</center>

<script runat="server" type="text/C#">
protected void Page_Load(object sender, EventArgs e)
{
tbDebug.Text = DateTime.Now.ToString();
// tbDebug.Attributes.Add("onfocus", "javascript:alert('on focus');"); //焦点设置上后弹出提示窗口
}
protected void btn_Click(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(1000); //如果不延迟,基本上都能设置焦点成功

ScriptManager.RegisterStartupScript(this, this.GetType(), "OOKK"
, "setTimeout(\"document.getElementById('" + tbDebug.ClientID + "').focus();\",500);" , true);
tbDebug.Text = DateTime.Now.ToString();
}
</script>

</body>
</html>

catman3000 2009-02-26
  • 打赏
  • 举报
回复
谢谢楼上的回复,我是在 AJAX 返回的结果中,带出了脚本 focus(),为了防止出现同步问题,专门使用了 setTimeout 函数,延迟了很多秒才执行这个 focus(),就是为了防止出现 AJAX 对它的干扰,但这样都不行。
lm4242 2009-02-26
  • 打赏
  • 举报
回复
ajax是异步执行的,就是说调用ajax的时候,其他的js代码还会继续执行,有可能是ajax还没返回,就执行了onfocus,返回后执行其他代码,导致失去焦点。

87,904

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧