(asp.net,javascript,HTML)输入框回传引起的问题

今天csdn一网友突然问起如何在输入框获取回车然后跳转,并且说明跳转他通过后台一按钮的点击事件写了。我当时不假思索的说:可以在输入框(服务器端textbox)前台代码加上这样一段代码

onkeypress event

onkeypress="if(event.keyCode == 13) document.all.button1.click();"

就应该可以实现其功能了,后来该网友说有问题,说是用这个代码有点不正常。我说你把代码给我看看,于是他传了以下代码给我(缩减了和主题无关的代码)

主页面前台.aspx主要代码

<%=strList[0]%>

<%=strList[2]%>

<%=strList[3]%>

<asp:TextBox runat="server" ID="xx" onkeypress="if(event.keyCode==13) document.getElementById('ibtn').click();" />

<asp:ImageButton runat="server" ID="ibtn" onclick="ibtn_Click" />

主页面后台.cs主要代码

public List<string> strList = new List<string>();

protected void Page_Load(object sender, EventArgs e)

{

   if(!IsPostBack)

   {

       DataTable dt = GetData(); //GetData返回的是一个datatable,但是不一定有数据。

       for(int i=0;i<dt.Rows.Count;i++)

      {

          strList.Add(dt.Rows[i][0].ToString());

      }

    }

}

protected void ibtn_Click(object sender, EventArgs e)

{

    string searchname = xx.Text.ToString();

    Response.Redirect("result.aspx?user=" + searchname);

   //Server.Transerfer("result.aspx?user=" + searchname);

}

 

result.aspx主要代码

<%=strList[0]%>

<%=strList[1]%>

<%=strList[2]%>

result.cs主要代码

public List<string> strList = new List<string>();

protected void Page_Load(object sender, EventArgs e)

{

    if(!IsPostBack)

    {

        DataTable dt = GetData(); //GetData返回的是一个datatable,但是不一定有数据。

        for(int i=0;i<dt.Rows.Count;i++)

       {

           strList.Add(dt.Rows[i][0].ToString());

       }

    }

}

我简单的看了下代码,想当然的说应该不是你代码的问题,可能是你的ie有问题吧,但是网友修复ie后仍然出现这个问题,据说用其他同事的机器仍然会出现问题。这时我才问他到底是什么问题有什么现象了? 他说:

1. 给相关方法的最上层下断点,可是当输入框按回车时大多数时候并未执行按钮的后台代码,不过有时候还是会进去。

2. 到最后页面会报错错误信息就是主页面的strList没有数据。 我在自己机器上面只用了这些代码测试了下也发现了他说的问题,不过我调试的时候就一直没发现执行按钮的后台代码。

 从网上搜索了下中文网页,其中有个人说:输入框回车触发回传不是asp.net设定了而是html标准是这样的。通过这句话我推测可能是输入框的回传先于点击按钮触发回传执行。于是我修改了下输入框的onkeypress事件代码以阻隔输入框回车的影响:

onkeypress event

onkeypress="if(event.keyCode == 13) { event.returnValue = false;document.all.button1.click();}"

这样修改代码,跳转就正常了。后来我就寻思未修改前:到底document.***.click()有没有执行了?于是我又改动了代码:

onkeypress event

onkeypress="if(event.keyCode == 13) { document.all.button1.click();alert('xxxx');}"

嘿嘿居然发现先跑到了page_load然后又执行了按钮点击的后台代码,但是最后页面还是停留在了主页面上(就算我去掉主页面的if(!IsPostBack))。不过如果我把alert放到document.**.click()前面后又恢复到最开始的问题:按钮点击后台代码并未执行。

于是我推测:

1 假如不加alert语句可以认为按钮点击的产生postback和输入框默认的postback同时发生,而ie可能只认输入框的postback,而忽略了按钮的postback。

2 由于后加的alert语句将输入框产生的回传滞后了,使得其回传晚于按钮点击产生的回传,因此就会产生两次回传,因此程序会执行跳转,也会执行输入框的postback,并将最后postback的请求响应返回给客户端(输入框的postback并未有任何实质性动作,而点击按钮postback可能优先级不如输入框postback,所以最终返回的还是主页面)。而后者不会执行if(!IsPostback)里面的东西从而导致主页面的strList没有数据进而出现错误。

如果o以上论述有任何错误,请各位老大不吝赐教。

ps:如果不适合放在首页,也希望管理大大和各位老大高抬贵手,让o得到满意答案再流放o的文章。不甚感激!!!

原文地址:https://www.cnblogs.com/ocean2000/p/1327852.html