一个问题的解决过程。

一个问题的解决过程。
要求:
 在页面上有一个按钮<input id="btnAssure" runat="server" value="Assure">
 点击它的时候触发 onclick[ShowBalanceAgain()]和onserverclick 2个click事件。
 onserverclick的工作是修改页面一个隐藏层div的内容。
 onclick的工作是createElement一个div. div里引用了隐藏层的内容。
问题:
    click的时候页面不弹出
探索
 1:为什么click页面不弹出
     既然click 时,页面不弹出有2中原因,一种是没有执行onclick 的ShowBalanceAgain.
  令一种执行了,但页面post刷新了。
  我查看了一下源代码
  ShowBalanceAgain(); __doPostBack('ctl00$ContentPlaceHolder1$btnAssure','')
  可见浏览器click要先于serverclick执行.所以原因应该是后者。
    2:  能不能有一种机制让serverclick先执行、onclick后执行呢?
  为了让serverclick限制性,我使用了这种机制。
  当 page_load的时候
   this.btnAssure.Attributes.Add("onclick", "ShowBalanceAgain();return;");
  先return,这样就不会执行__doPostBack
  然后自己写js方法
  function useRasin()
  {
   __doPostBack("<%=btnAssure.ClientID%>");
  }
  调用时顺序
   useRasin(),ShowBalanceAgain();
  感觉这样很好,可是运行后才知道自己愚蠢至极。
  只要post,也就是__doPostBack。弹出的div 都会消失。不管你是先、是后!
     3:我该如何是好?
     既然post后,弹出的div就会消失。那我就不post。如果不post。如何实现刚开始我提出的要求呢。
  好了,我想到了ajax。
    <script language="javascript" type="text/javascript" defer="true">
    var xmlHttp;
    function createXmlHttp()
    {
     //IE browser
     if(window.ActiveXObject)
     {
      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
     }
     else if(window.XMLHttpRequest)
     {
      xmlHttp=new XMLHttpRequest();
     }
    }
    
    function  refreshModelList()
    {
     var url="ajax.aspx?ts="+new Date().getTime();
     createXmlHttp();
     xmlHttp.onreadystatechange=handleStateChange;
     xmlHttp.open("GET",url,true);
     xmlHttp.send(null);
     //   alert("refreshModelList");
    }
    function handleStateChange()
    {
     if(xmlHttp.readyState == 4)
     {
      if(xmlHttp.status == 200)
      {
       updateModelsList();
      }
     }           
    }
    
    function updateModelsList()
    {
     document.getElementById("<%=lblOrderAmount.ClientID %>").innerText=xmlHttp.responseText.split(",")[0];
     
    }

    function ShowBalanceAgain()
    {
     //Div3
     //debugger
     //ajax called
     refreshModelList();
     CancelOper(2);
     //alert(document.getElementById("lblMessage").innerText);
     createWindow('结算中心', 340,100, '#ffffff', 3, 0, 0, 0);
     makeCenter(3);
     //useRasin();
     return false;
    }   
    </script>

   
   


   我用了ajax,窗口是弹出来了,但不是serverclick修改后的内容。
   我明明document.getElementById("<%=lblOrderAmount.ClientID %>").innerText=xmlHttp.responseText.split(",")[0];
   做了这个操作。为什么不会修改呢?
  4:  ajax为什么不成功
   百思之后,才知道自己用了异步ajax[asynchronism].读取的内容有一定的滞后性[特别是耗时很长时,滞后性更大。]
   如果改用同步就可以实现刚开始的要求。但一定程度上失去了ajax的意义。
  5: 除了ajax还有别的方法吗?
   俗话说条条道路通罗马,有偷懒的方法,但从逻辑上不一定正确。
  6: 如何做呢?
   我在页面上弄一个隐藏域 ,它有runat="server"的属性
   <input type="hidden" id="hidOperate" name="hidOperate" value="0" runat="server" />
   
   当serverclick的时候我设置隐藏域为1
   //this operating is to show balance's window,please don't remove it !
            this.hidOperate.Value = "1";

  
   在页面上加上
   <script language="javascript">
    if(document.readyState=="complete")
    {
     //弹出窗口
    }
    else
    {
     document.onreadystatechange=function(){
       if(document.readyState=="complete")
       {
            //弹出窗口 
       }}
     }
   </script>

   note:用readystate是为了防止页面DOM树的结构发生紊乱

       
  7:好了,写完了,大家拍砖吧。

你可能感兴趣的:(问题)