【问题标题】:How to retain focus on asp textbox or any html element) after postback回发后如何保持对asp文本框或任何html元素的关注)
【发布时间】:2014-10-22 03:35:07
【问题描述】:

我正在创建有大约 20~ 左右 asp:TextBox 的网站,它们都使用回发。 我遇到的问题是每次回发时文本框都会失去焦点。 我已经设法将注意力集中在称为回发的元素上,但这不是我想要的,因为到那时新框已被关注。 我发现很少有 javascript 在回发后应该保持焦点,但无法让其中一个工作。 老实说,我不太了解 javascript,也不知道如何使用正确的程序,但似乎没有办法仅使用 html 和 c# 来实现我想要的。

 <div class="row">
        <div class="col-sm-6">
            <div class="form-group">
                <div class="form-group" id="vacancyTitleGroup" runat="server">
                    <label for="inputTitle" class="col-sm-5 control-label">Vacancy title  <b>*</b></label>
                    <div class="col-sm-7">
                        <asp:TextBox runat="server" type="text" class="form-control" ID="inputTitle" placeholder="Vacancy title" OnTextChanged="inputTitle_TextChanged"  AutoPostBack="True" MaxLength="50"></asp:TextBox>
                    </div>
                </div>
                <div class="form-group" id="positionGroup" runat="server">
                    <label for="inputPosition" class="col-sm-5 control-label">Employee Position</label>
                    <div class="col-sm-7">
                        <asp:TextBox runat="server" type="text" class="form-control" ID="inputPosition" placeholder="Employee Position" OnTextChanged="inputPosition_TextChanged" AutoPostBack="True"></asp:TextBox>
                    </div>
                </div>
                <div class="form-group" id="disciplineGroup" runat="server">
                    <label for="inputDiscipline" class="col-sm-5 control-label">Job Field/Discipline</label>
                    <div class="col-sm-7">
                        <asp:TextBox runat="server" type="text" class="form-control" ID="inputDiscipline" placeholder="Job Field/Discipline" OnTextChanged="inputDiscipline_TextChanged" AutoPostBack="True"></asp:TextBox>
                    </div>
                </div>
                <div class="form-group" id="contractGroup" runat="server">
                    <label for="inputContract" class="col-sm-5 control-label">Contract Type <b>*</b></label>
                    <div class="col-sm-7">
                        <asp:TextBox runat="server" type="text" class="form-control" ID="inputContract" placeholder="Contract Type" AutoPostBack="True" OnTextChanged="inputContract_TextChanged"></asp:TextBox>
                    </div>
                </div>

这里是一些我想要保持焦点的 html 对象,我被困了半天,如果有人能给我粗略的指导如何在回发后保持焦点,我将永远感激不尽。

【问题讨论】:

  • 您是否熟悉if(IsPostBack),您能否在 Page_Load` 上执行 SomeControl.Focus(),前提是它位于条件语句的回发部分中。此代码对您的问题没有任何帮助,也显示您的 .cs 代码隐藏,如果您确定要在触发/触发特定事件时设置焦点,我也会在 __DoPostBack() 方法中执行此操作..
  • 我很好奇你为什么在每个 TextChanged 上回发到服务器。这对最终用户来说真的很烦人。
  • @Win 用于数据验证,我可能只需要几个回帖就可以侥幸逃脱,但我仍然会放松对这些领域的关注,为什么最终用户会感到烦恼?
  • @DJKRAZE 我熟悉 IsPostBack。我已经尝试过你的建议,但我需要知道当前的焦点对象,据我所知,没有办法将当前的焦点存储在服务器端,在回发时恢复它。我可以将焦点存储在 textChanged 事件上,但是当对象失去焦点并存储失去焦点的对象而不是获得焦点的新事件时,就会发生这些事件。最终结果:每次切换到新文本框时,都会发生 autoPostBack,并且焦点会跳转到上一个文本框,因为它是存储焦点的文本框。

标签: javascript c# jquery html asp.net


【解决方案1】:

我认为没有直接保持焦点的简单方法,但您可以添加一个隐藏字段并将活动元素发布到其中:

假设隐藏字段的 id 是“hdnSelectedField”。一个应该工作。

使用 JQuery:

<asp:HiddenField ID="hdnSelectedField" runat="server"  ClientIDMode="Static"  />
<script>
    // this creates an event that fires any time any "input" type element gets focus
    $("input").focus(function (e) {
        // get the target's type attribute (i.e. text, button, checkbox) and make sure it isn't submit
        if ($(e.target).attr('type') != 'submit') {
            // get the currently focused element's id & store it in the hidden field for postback processing
            var activeElem = document.activeElement.name;
            $("#hdnSelectedField").val(activeElem);
            // this just makes it obvious that something is happening. Set a <span> to the field's id
            $("#selectedElementName").html(activeElem);
        }
    });

</script>

在页面加载时:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            var fieldSelectedName = hdnSelectedField.Value;
            if(!String.IsNullOrEmpty(fieldSelectedName))
                Page.FindControl(fieldSelectedName).Focus();
        }
    }
  • 编辑为使用 clientIDMode=static 并在 asp.net 面板中工作。请注意,它现在按名称搜索。

【讨论】:

  • Java 脚本可以使用 onfocus html 事件,所以我们可能会在没有隐藏字段的情况下逃脱,问题是我从未编写过任何 javascript 并且不知道如何使用它。
  • 你可以不使用隐藏字段,但你仍然需要通过回发保持状态,所以需要某种形式的数据持有者......要么将它添加到查询字符串,使用 cookie ,或使用隐藏字段)
  • 嗯,我总是收到 nullreferenceexception,如果我有很多 div 和很多表单,我应该把 放在哪里?就像您在我的示例代码中看到的那样,这是我页面的开始
  • 您可以将隐藏字段放在您的主 asp.net 表单中的任何位置。位置应该不重要,但我总是倾向于将它们放在底部。您可以在主页上发布您的内容吗?我也许能够看到导致问题的原因。
  • 主页就像任何页面一样没有任何额外的东西,主页面包含大部分信息。我已经压缩了我的项目,如果你有 Visual Studio,那么只看它而不是发布一堆代码可能会更容易。如果您没有 VS,请告诉我,为您的所有帮助欢呼。 drive.google.com/file/d/0B7OaaychgL0_dHcwZTFZMExWTzg/…
猜你喜欢
  • 2011-10-08
  • 2016-02-15
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多