zoukankan      html  css  js  c++  java
  • (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的文章。不甚感激!!!

  • 相关阅读:
    File IO (Examples)
    File IO (AsciiToBinary / BinaryToAscii)
    Bit Operation (Message Compression/Decompression)
    Use GDB to debug code (2Example)
    Linked List in C (3Sorted List)
    在用户控件 ASCX 创建用户控件 ASCX
    恢复现有mongodb中的单个集合
    恢复现有mongodb中的单个集合
    WebForm与MVC混用
    WebForm与MVC混用
  • 原文地址:https://www.cnblogs.com/ocean2000/p/1327852.html
Copyright © 2011-2022 走看看