将ASP.Net控件ID发送到JavaScript函数

时间:2013-10-23 13:30:33

标签: c# javascript asp.net

我有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 */
}

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

使用内置功能而不是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。您可以在<asp:View..周围包装div,然后执行以下操作:

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

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

答案 2 :(得分:0)

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

 <asp:Textbox id="txtName" runat="server" 
onfocusout='<%= String.Format("SetFocus(\"{0}\");", txtAge.ClientId) %>'></asp:TextBox>

答案 3 :(得分: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();
}

答案 4 :(得分:0)

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

您无需发送ClientId