我有一個頁面(http://waikee.comm01.com/xx.aspx)運行后,如下圖
就是先點擊TextBox1再點擊TextBox2,你可以看到兩個文本框中的內容都自動復制了。
上述問題是在Chrome中出現,而IE8中卻不會出現上述問題。
因我很多地方有用到類似這種方式的代碼,我想知道是什么原因引起的,需要找到對應解決方案。
頁面代碼:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="xx.aspx.cs" Inherits="xx" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
<script type="text/javascript">
function txt_onblur()
{
document.getElementById("Button1").click();
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ToolkitScriptManager runat="Server" EnableScriptGlobalization="true" EnableScriptLocalization="true" ID="ScriptManager1" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text="10" onblur="txt_onblur()"></asp:TextBox>
<asp:TextBox ID="TextBox2" runat="server" Text="20" onblur="txt_onblur()"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button"/>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
后臺代碼(都沒內容):
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
在TextBox1獲得焦點有情況下,在TextBox1外部點擊,會執行腳本后觸發提交頁面,
沒有問題,但如果不在TextBox1外部點擊,而是在TextBox2中點擊,兩個文本框中的內容會自動復制。
这段话描述再清楚一点,听不懂
頁面地址在這里(http://waikee.comm01.com/xx.aspx),您可以照我的說試一下.
就是先點擊TextBox1再點擊TextBox2,你可以看到兩個文本框中的內容都自動復制了。
@walkingboy:
頁面地址在這里(http://waikee.comm01.com/xx.aspx),您可以照我的說試一下.
就是先點擊TextBox1再點擊TextBox2,你可以看到兩個文本框中的內容都自動復制了。
代碼是完整的,你可以看看效果圖
@walkingboy:
我监控了一下,发现在Chrome里面事件被触发了两次,第两次发送给服务器的值是双份
@Rich.T:
多謝,就是這個問題。那為什么會是第二次發給服務器的值是雙份的?
就是搞不懂這個問題!
@walkingboy:
因为你文本1失去焦点触发了post,
同时你又点进了文本2再次触发post
@Rich.T:
兩次請求不是分開的嗎?
怎么會疊加文本值呢?
@walkingboy:
这个估计是chorme浏览器是这样的,两次请求在同一时间发出,估计他第二次也第一次也并进来了
你换了个事件来触发吧,不要用失去焦点
@Rich.T:
那您有什么解決方法可以取消第二次請求嗎?我這里只需要一次請求就夠了。
因我很多地方都用到了類似的代碼。
@walkingboy:
你试试这个方法:文本1得到焦点时,让文本2不能获取焦点(设为只读还是禁用,你自己试下)
这样应该就不会出事你这种情况了
@Rich.T:
好的,謝謝您,我測試一下。
@walkingboy:
經測試,此思路可行,設為“禁用”即可,謝謝您。
楼主你的图挂了
已經修復,謝謝!
@walkingboy:
你的是在2个textbox中都写上了同样的blur的客户端代码,都是点击button,然后提交了。看你的后台也没有什么代码,怎么会有你说的问题呢? 是不是你的代码买有贴完全?
@chenping2008:
就是先點擊TextBox1再點擊TextBox2,你可以看到兩個文本框中的內容都自動復制了。
代碼是完整的,你可以看看效果圖
@walkingboy:
通过chrome开发者工具可以看到,你上述的操作,有了2次的请求发出。
IE下没有这样的问题。
也许是游览器处理的方式不一样。
还有就是写AJAX的话,可以考虑完全放弃微软的ajax框架。
@chenping2008:
是可以不用微軟的Ajax,但我這里已經用了,而且有很多地方都用到了。
有一些計算問題,我必須要放到后臺代碼中去運行,以核對前臺數據的合法性。
@walkingboy: 试一下这个:
<script type="text/javascript"> function txt_onblur() { var v = document.getElementById("HiddenField1").value; if (v == "1") { document.getElementById("HiddenField1").value = 0; document.getElementById("Button1").click(); } } </script>
<asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <asp:TextBox ID="TextBox1" runat="server" Text="10" onblur="txt_onblur()"></asp:TextBox> <asp:TextBox ID="TextBox2" runat="server" Text="20" onblur="txt_onblur()"></asp:TextBox> <asp:Button ID="Button1" runat="server" Text="Button"/> <asp:HiddenField ID="HiddenField1" runat="server" Value="1" /> </ContentTemplate> </asp:UpdatePanel>
protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { this.HiddenField1.Value = "1"; } }
@chenping2008: 如果楼主能够忍痛放弃的话,对以后的代码肯定有好处
@chenping2008:
謝謝您,您的思路是好的,也是取消了第二的請求。
我最終采用了:文本1得到焦点时,让文本2不能获取焦点(设为禁用)
@walkingboy: 那请问,你在什么时候开启了文本2 的焦点呢? 还有就是如果是点击文本2的时候,是不是也要让文本1失去焦点
@chenping2008:
1.你在什么时候开启了文本2 的焦点呢?
這個,不太好處理,可能需要判斷是失去焦時鼠標所在的位置,不過我暫時好像沒出現這個問題,請求后禁用的狀態會自己取消。
2.还有就是如果是点击文本2的时候,是不是也要让文本1失去焦点
是