0

我有 2 个视图。view1 上的最后一个控件是 txtName,而 view2 上的第一个控件是 txtAge。需要在 TAB 按下时将焦点从 txtName 更改为 txtAge,但我无法做到这一点。

ASPX:

<asp:Multiview ID ="multiview1" runat="server" ActiveViewIndex="0">
  <asp:view ID="view1" runat="server">
  <asp:Textbox id="txtName" runat="server" 
onfocusout="SetFocus('<%=txtAge.ClientId%>');"></asp:TextBox>
  </asp:view>

<asp:view ID ="view2" runat="server">
   <asp:Textbox id="txtAge" runat="server" ></asp:TextBox>
</asp:view>
</asp:Multiview>

JS:

function SetFocus(controlId){
    /*alert(controlId);*/
 document.getElementById(controlId).focus();
}

当我检查警报时,它会显示<%=txtAge.ClientId%>在弹出窗口中。这哪里错了。

这是我的新发现:

当目标控件在同一个视图中时,此代码运行良好,但当它在另一个视图中时,则不会。所以我认为,还应该做一些其他的事情来先改变视图,然后再担心焦点:

<asp:Textbox id="txtName" runat="server" 
onfocusout="SetFocus();"></asp:TextBox>

function SetFocus(){
 document.getElementById('<%=txtEmail.ClientID%>').focus();
 /* txtEmail is in the same view 'view1' as in txtName */
}
4

5 回答 5

1

也许使用http://msdn.microsoft.com/en-us/library/ms178231%28v=vs.100%29.aspx就足够了tabindex

使用内置功能而不是javascript。

如果您使用 asp.net 4.x,您可以使用 clientidmode=static http://msdn.microsoft.com/en-us/library/system.web.ui.control.clientidmode.aspx

<asp:Multiview ID ="multiview1" runat="server" ActiveViewIndex="0">
    <asp:view ID="view1" runat="server">
        <!-- other controls -->
        <asp:Textbox id="txtName" runat="server" TabIndex="1"/>
    </asp:view>
    <asp:view ID ="view2" runat="server">
        <asp:Textbox id="txtAge" runat="server" TabIndex="2"/>
        <!-- other controls -->
    </asp:view>
</asp:Multiview>

如果您不介意使用 jQuery,请进行编辑。您可以将 div 包裹起来<asp:View..,然后执行以下操作:

$("div.view input:last-child").on("change", function(){
    $(this).parent().next().find("input:first-child").focus();
});

请记住,这是伪代码。这只是一个想法。

于 2013-10-23T13:37:39.923 回答
1

您可以尝试在服务器端代码中设置它:

txtName.Attributes["onfocusout"] = String.Format("SetFocus('{0}');", txtAge.ClientId); 
于 2013-10-23T13:36:31.320 回答
0

试试这个,看看它是否更好。

 <asp:Textbox id="txtName" runat="server" 
onfocusout='<%= String.Format("SetFocus(\"{0}\");", txtAge.ClientId) %>'></asp:TextBox>
于 2013-10-23T13:34:11.187 回答
0

onfocusout="SetFocus('<%=txtAge.ClientId%>');"></asp:TextBox> 行为onfocusout="SetFocus('txtAge');"></asp:TextBox>

您不需要发送 ClientId

于 2013-10-23T14:32:01.373 回答
0

在这种情况下,无法使用内联块设置属性......正如您所看到的,您正在获取文字<%=txtAge.ClientId%>文本,并且您没有得到您期望的处理值。

你有两个明显的解决方案......

第一个(Yuriy 在他的回答中已经给了你)是从后面的代码中设置它......

txtName.Attributes["onfocusout"] = String.Format("SetFocus('{0}');", 
                                                 txtAge.ClientId);

(免责声明,我不知道它MultiView是什么,因为我从未使用过它,所以我不能 100% 确定下面的第二个选项是否真的适用于您的场景。此外,它是未经测试的代码。)

另一种是使用 Murali 在他的回答中提供的内容,但需要额外的操作......

<asp:Textbox id="txtName" runat="server" onfocusout="SetFocus(this);" />

function SetFocus(nameCtrl) {
  var ageId = nameCtrl.id.replace(/txtName/,"txtAge");
  var ageCtrl = document.getElementById(ageId);
  ageCtrl.focus();
}
于 2013-10-23T13:53:43.397 回答