日期:2014-05-17  浏览次数:20439 次

OnClientClick的问题。迷惑了很久
虽然问题解决了,但我还是不知道为什么会这样。所以请假下,
都知道服务器控件有onclick和OnClientClick事件,OnClientClick是执行客户端脚本。当返回true时才执行onclick,我现在就有这么一个服务器控件

<asp:Button ID="btnRegist" runat="server" Text="提交"
OnClientClick="return CheckAll()" onclick="btnRegist_Click" />

脚本中的CheckAll()函数,为了不让页面刷新。有个异步请求验证,信息是否正确,贴上主要代码,以下原始的js脚本写请求。就执行。

 function CheckAll()
{
var xmlhttp=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.open("POST","check.ashx",true);
xmlhttp.send("name=xxx&pwd=xxx");

xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
var result = xmlhttp.responseText;
if(result=="xxx"){
//逻辑判断
}
    }
  }

}  


可我用jquert这样写为什么就不执行请求。所以我很纳闷

  function CheckAll()
{
$.post("check.ashx",{name:"xxx"},function(result){
if(result=="xxx"){
//逻辑判断
}
});



会的帮我解释下。谢谢。
OnClientClick

------解决方案--------------------
1.监视ajax请求:
使用chrome或者FireBug监视ajax是否执行,参数是否正确
2.断点ashx文件,看是否进入了ashx了。
------解决方案--------------------
唉 还是加断点看看有进去ashx文件没有
------解决方案--------------------
可能是以下原因,未测试。。。。

jquery的post是异常请求,你的客户端请求发出去了,还未等到server返回消息,此时就执行了submit button的post动作,即立即会执行click事件(服务端方法btnRegist_Click),所以你此时已经监视不到客户端的post请求,也执行不到你的客户端回调方法(function(result).....)。

function CheckAll()
{
    $.post("check.ashx",{name:"xxx"},function(result){
        if(result=="xxx"){
            //逻辑判断

            //... 最后在此处提交表单, 应加一个全局变量标识,不执行后面的retrun false
        }
    });   

    return false;     //加这一句,不要立即表单,等待服务返回             


或使用$.ajax的同步方式(推荐)
$.ajax({
   type: "POST",
   url: xxx,
   data: xxx,
   async: false,
   success: function(msg){
     //your business...
   }
});
------解决方案--------------------
实际上要想比较清晰简单,那么你的 CheckAll 就应该永远 return false。因为它根本不能立刻返回(为了避免界面上卡死),所以它也就根本不能正常地告知 OnClientClick 是否要继续执行页面回发。也就是说,你的OnClientClick立刻执行完毕了,而此时根本不能断定是否可以回发页面。

在你的 CheckAll 的异步回调中,你才应该调用 GetPostBackEventReference(btnRegist,string.Empty) 去回发页面。只有回调中才能触发这个操作,而不是在 OnClientClick 执行时。

异步编程要求你改变原来的思维方式。


引用:
或使用$.ajax的同步方式(推荐)

同意!

------解决方案--------------------