【问题标题】:ASP.net / Javascript: Automatically postback triggering and next control to have focusASP.net / Javascript:自动回发触发和下一个控件以获得焦点
【发布时间】:2012-12-05 21:19:26
【问题描述】:

我将在我的问题开始前声明,我对 ASP 和 VB 编程还很陌生,还没有接触过所有必须提供的语言和框架。

我正在使用 VB 构建一个 ASP 站点,我有特定的要求要遵循。在有问题的表单部分中,一系列文本框收集了项目的数量。回发时,数量用于重新计算总计。所有这些控件都能完美地执行计算。

对于这个表单,我使用 OnChange Javascript 事件在其中任何一个被修改时触发回发。这也可以正常工作。但是,当用户在被更改的文本框之外单击或使用选项卡并触发回发时,似乎没有任何控件具有焦点。

如果用户单击另一个控件,我需要将焦点放在用户单击的控件上。是否有事件或方法可以捕获在触发回发之前立即获得焦点的控件的 ID?我已经看到了几个问题和答案,它们演示了如何收集实际触发回发的控件的 ID,但这会将焦点直接放回刚刚更改的字段。

无论是否将焦点放在触发回发的控件中,该行为都要求用户选择下一个控件两次,一次间接触发回发,一次将焦点放在所需控件中。

【问题讨论】:

  • 看看我已经问过的这两个问题。 First 一个是关于在键入一些按键后设置焦点,而second 是关于捕获“tab”笔划并触发一个事件。
  • 您有任何可以显示的代码吗?另外,为什么要回发每个控件?
  • 我将很快发布相关代码,但我只是对每个正在更改的文本框进行回发,这只是由于我对 .Net 框架缺乏经验。关于使用 UpdatePanel 的答案是回发问题的“正确”答案,但我仍然无法使用 JavaScript 自动触发我创建的隐藏按钮的 .click 方法来触发 UpdatePanel 的刷新。

标签: javascript asp.net vb.net event-handling focus


【解决方案1】:

我不确定我是否完全理解您,但我已尝试根据您的描述重新创建您的场景,并且使用 UpdatePanel 看起来是一个简单的解决方案。这是一种快速简便的 ajaxifying 页面方法,无需担心细节。用 UpdatePanel 包围正在更新的字段,并为导致回发的控件(在本例中为隐藏按钮)添加 AsyncPostBackTrigger:

<script type="text/javascript">
    function pb() {
        document.getElementById("<%= btnPostBack.ClientID %>").click();
    }
</script>
<asp:button id="btnPostBack" runat="server" onclick="PostBack" style="display: none;" />

<asp:textbox id="t1" runat="server" onchange="pb();" />
<asp:textbox id="t2" runat="server" onchange="pb();" />
<asp:textbox id="t3" runat="server" onchange="pb();" />
<asp:textbox id="t4" runat="server" onchange="pb();" />

<asp:updatepanel id="update" runat="server">
    <contenttemplate>
        <asp:label id="label" runat="server" />
    </contenttemplate>
    <triggers>
        <asp:asyncpostbacktrigger controlid="btnPostBack" />
    </triggers>
</asp:updatepanel>

在后面代码中的 PostBack 方法中,我只是汇总了 t1、t2、t3 和 t4 中的值。我可以从一个 TextBox 切换到下一个添加文本,并且标签会更新而不会丢失焦点。

【讨论】:

  • 我喜欢这个解决方案,我已经按照您的建议实施了它。我在我的 aspx 文件中使用 getElementByID 创建了一个简短的 javascript,并按照建议将定价控件包装在带有 AsyncPostBackTrigger 的 UpdatePanel 中。然而,onchange 事件并没有触发,尽管它出现在包含正在计算的值的文本框中。测试 UpdatePanel,我关闭了内联 CSS 以查看页面上的按钮。当我更改相关框时,UpdatePanel 会按预期触发。但是,JavaScript 事件不会触发。
  • 这个答案是有效的,除了策略的改变......当我试图利用 OnBlur 并动态设置焦点时,我已经为每个有问题的文本框创建了 TextChanged 事件处理程序.我只是将每个控件作为附加触发器添加到 UpdatePanel 定义中。我还从控件定义中删除了以前的 OnTextChanged 属性,并将其替换为 AutoPostBack = True。现在,每个控件都会异步回发到面板。谢谢!
  • 是的,我也会这样做。我只使用了 javascript 和隐藏按钮,因为听起来你可能就是这样做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 2012-08-19
相关资源
最近更新 更多