ajax是异步执行的,就是说调用ajax的时候,其他的js代码还会继续执行,有可能是ajax还没返回,就执行了onfocus,返回后执行其他代码,导致失去焦点。

解决方案 »

  1.   

    谢谢楼上的回复,我是在 AJAX 返回的结果中,带出了脚本 focus(),为了防止出现同步问题,专门使用了 setTimeout 函数,延迟了很多秒才执行这个 focus(),就是为了防止出现 AJAX 对它的干扰,但这样都不行。
      

  2.   

    代码如下:<%@ 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>
      

  3.   

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

  4.   

    如果 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>
      

  5.   

    找到办法了,不用 JS 的设置焦点,而调用 AJAX 类库中的设置焦点函数:
    ScriptManager1.SetFocus(tbDebug);