我在ASP.NET中遇到以下问题:有一个表单,其中包含一个文本框和一个旁边的按钮,填充框后应由用户按下(http://www.burnthespam.info上的示例,单击“选择你的”,或在弹出窗口中使用ReCaptcha时)。相反,用户通常会按ENTER
键提交表单。
这不会导致按钮上的click事件被触发,并可能导致意外行为。在burnthespam中,我“尝试”通过检查文本框中是否有数据来解决(但现在如果你做的不同于按下ENTER
,就像你按下它一样)来解决它。
您是否知道是否有另一种方法可以使用ENTER
键处理表单提交,或者当您按ENTER
按下我喜欢的按钮时,还有一个Javascript片段?
我想处理服务器端上的ENTER键事件,即。我已经
了protected void button_Click(object sender, EventArgs e)
{
Response.Redirect(...);
}
我希望不仅在我使用按钮提交表单时调用该方法(单击或突出显示空格),而且当用户在聚焦文本框时按下ENTER
您知道是否可以以编程方式点击Javascript中的按钮?也许不可能阻止网络钓鱼/垃圾邮件(例如,参见Facebook和“分享给朋友”),但我仍然想问......
答案 0 :(得分:3)
这是一种适用于ASP.NET的简单方法:
在.aspx页面中添加此内容
<script type="text/javascript">
function clickButton(e, buttonid) {
var evt = e ? e : window.event;
var bt = document.getElementById(buttonid);
if (bt) {
if (evt.keyCode == 13) {
bt.click();
return false;
}
}
}
</script>
并在aspx.cs文件的Page_Load中添加它
textbox1.Attributes.Add("onkeypress", "return clickButton(event,'" + buttonName1.ClientID + "')");
答案 1 :(得分:2)
你可以试试这个:
<html>
<head>
<script type="text/javascript">
function test(e){
var keynum;
if(window.event) // IE
{
keynum = e.keyCode
}
else if(e.which) // Netscape/Firefox/Opera
{
keynum = e.which
}
if(keynum==13) __doPostback('yourButtonId', '');
}
</script>
</head>
<body>
<input type="text" onkeypress="test(event)" />
</body>
</html>
您需要将“yourButtonId”替换为您的按钮在标记中呈现的ID,即.NET代码中的ClientID属性。 __doPostback函数是.NET定义的用于处理其所有回发的函数。
答案 2 :(得分:0)
有些方法可以使用表单对象DefaultButton属性或面板的DefaultButton属性设置默认按钮,但我发现它们在过去的各种浏览器中都不可靠,所以通常我依赖于javascript。
此代码的唯一缺点是您必须使用页面指令关闭事件验证,但它应触发单击事件,并触发验证器以及所有这些。
以下是我们使用的代码示例。通常我会将寄存器函数放在实用程序类中,但对于此示例,它位于页面代码中。 试试这个。
<%@ Page Language="C#" EnableEventValidation="false" %>
<script runat="server">
protected void cmdSubmit1_Click(object sender, EventArgs e)
{
litValue.Text = "Value 1 - You entered: " + txtValue1.Text;
}
protected void cmdSubmit2_Click(object sender, EventArgs e)
{
litValue.Text = "Value 2 - You entered: " + txtValue2.Text;
}
/// <summary>
/// This function registers what button is clicked based on whatever control currently has focus
/// so for example if the user password field has focus then you can cause the enter button to click
/// if the enter key is pressed This works with ie and firefox as far as I know
/// </summary>
/// <param name="ControlWithFocus"></param>
/// <param name="ControlToClick"></param>
private void RegisterDefaultButton(System.Web.UI.Control ControlWithFocus, System.Web.UI.Control ControlToClick)
{
PostBackOptions p = new PostBackOptions(ControlToClick);
p.PerformValidation = true;
if (ControlToClick is Button)
{
p.ValidationGroup = ((Button)ControlToClick).ValidationGroup;
}
else if (ControlToClick is ImageButton)
{
p.ValidationGroup = ((ImageButton)ControlToClick).ValidationGroup;
}
else if (ControlToClick is LinkButton)
{
p.ValidationGroup = ((LinkButton)ControlToClick).ValidationGroup;
}
p.RequiresJavaScriptProtocol = false;
AttributeCollection a = null;
if (ControlWithFocus is HtmlControl)
{
a = ((System.Web.UI.HtmlControls.HtmlControl)ControlWithFocus).Attributes;
}
else if (ControlWithFocus is WebControl)
{
a = ((System.Web.UI.WebControls.WebControl)ControlWithFocus).Attributes;
}
if (a != null)
{
a["onKeyDown"] = string.Format("if (event.keyCode == 13) {{{0}}}"
, ControlToClick.Page.ClientScript.GetPostBackEventReference(p));
}
}
protected void Page_Load(object sender, EventArgs e)
{
RegisterDefaultButton(txtValue1, cmdSubmit1);
RegisterDefaultButton(txtValue2, cmdSubmit2);
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
</head>
<body>
<form id="form1" runat="server">
Enter Value 1: <asp:TextBox ID="txtValue1" runat="server"></asp:TextBox>
<br />
Enter Value 2: <asp:TextBox ID="txtValue2" runat="server"></asp:TextBox>
<br />
<asp:Literal ID="litValue" runat="server"></asp:Literal>
<asp:LinkButton ID="cmdSubmit1" runat="server" Visible="false" OnClick="cmdSubmit1_Click">Hidden Button 1</asp:LinkButton>
<input id="cmdSubmit2" runat="server" visible="false" type="button" value="Hidden Button 2" onserverclick="cmdSubmit2_Click" />
</form>
</body>