風人園

          弱水三千,只取一瓢,便能解渴;佛法無邊,奉行一法,便能得益。
          隨筆 - 99, 文章 - 181, 評論 - 56, 引用 - 0
          數據加載中……

          ECP--之彈出窗口解決方案(json傳遞)

                  在應用中,彈出式窗口選擇數據,這種解決方案是很普遍的。
                  彈出窗口,有兩種方式,一種是:showModalDialog,使用模式窗口,這種方式的好處有兩個地方,一、可以直接返回數據,二、在最前面顯示,避免用戶誤操作,窗口被遮蔽。
                  但是這種方式個人感覺比較致命的地方就是因為這個是一個對話框,在form提交的時候只能新開一個頁面(可能我沒有發現其他的方式)。但是也有其他的方式,如加iframe,但是這樣感覺頁面太煩了,需要兩個頁面才能實現,比較麻煩。

                  第二種:window.open,這種方式也有一個問題,就是會被當做廣告攔截掉,還算不是很致命。
          我的方案就是這個,下面上代碼。
          傳遞格式通過json,這樣我可以自己定義需要回填那些域,返回值這邊就是竟可能的完整。


          /*
          彈出窗口
          endtarget: string 目標窗口
          無返回
          */

          function fopenWindow(endtarget){
              window.open( endtarget, 
          """left=0, top=0, width=800px, height=600px, scrollbars=1, resizable=1, menubar=0, location=0, status=0, toolbar=0, " );
          }


          /*
          window.open的回調函數
          根據傳入的json格式,賦值相應的域值

          cmp:string 域id
          retval :json 所選行的數據
          無返回
          */

          function fopenCallback(cmp, retval){
              
              
          //alert("call back start." + cmp);
              var obj = eval('(' + cmp + ')');
              
              
          for(var e in obj ){
                  
          //alert(obj[e]);
                  document.getElementById(obj[e]).value = retval[obj[e]]
              }

          }


          window.openCallback 
          = fopenCallback;

          /* 
          獲取url上的參數
          返回:key value 對
          */

          function GetUrlParms()    
          {
              
          var args=new Object();   
              
          var query=location.search.substring(1);//獲取查詢串   
              var pairs=query.split("&");//在逗號處斷開   
              for(var i=0;i<pairs.length;i++)   
              
          {   
                  
          var pos=pairs[i].indexOf('=');//查找name=value   
                  if(pos==-1)   continue;//如果沒有找到就跳過   
                  var argname=pairs[i].substring(0,pos);//提取name   
                  var value=pairs[i].substring(pos+1);//提取value   
                  args[argname]=unescape(value);//存為屬性   
              }

              
          return args;
          }
                      

          /*
          行雙擊方法,用戶選擇行數據。
          通過回調函數,完成賦值,最后關閉窗口
          rtnval: string 行數據
          */

          function Dialog_onDblClick(rtnval)
          {
              
          //var rtnval = {prodId: prodId, prodName: prodName};
               
              
          var args = new Object();
              args 
          = GetUrlParms();
              
          var cmp = args['cmp']
              
              window.opener.openCallback(cmp, rtnval); 
              window.close();
          }


          主頁面 域id通過json字符串跟url傳遞后彈出頁面
          function popProductDialog(){
              var endtarget = "<%=path%>/bas/product.do?method=dialog";
              var cmp = "{a: 'prodId', b: 'prodName'}";
                 //fshowModalDialog(endtarget, cmp);
                
                 fopenWindow(endtarget+ "&cmp=" + cmp);
                
             }

          彈出框
          function Document_onDblClick(value1,value2)
                      
          {
                          
          var rtnval = {clientId:value1, clientName:value2};    
                              Dialog_onDblClick(rtnval);

                      }
          彈出頁面解析獲得域id,并通過循環域id從返回值中獲取數據,并進行賦值。

          這里唯一需要變的就是,彈出頁面的返回值,可能因為需求的增加,需要返回更多的數據,或者就一次性將所有數據都作為json數據返回。

          這樣客戶在調用的時候,只要域id不超出返回字段的范圍,就可以正確使用了。

          posted on 2009-08-31 10:39 風人園 閱讀(575) 評論(0)  編輯  收藏 所屬分類: ECP

          主站蜘蛛池模板: 尖扎县| 永仁县| 和林格尔县| 马鞍山市| 类乌齐县| 大宁县| 陈巴尔虎旗| 巫山县| 南雄市| 灵璧县| 昌江| 江油市| 临漳县| 西乡县| 阿拉善左旗| 沽源县| 上蔡县| 定西市| 芜湖市| 淮滨县| 杭锦后旗| 西昌市| 隆德县| 盐城市| 石棉县| 永济市| 杭州市| 宁都县| 余姚市| 南陵县| 霍山县| 石狮市| 荣成市| 博兴县| 平度市| 环江| 遂宁市| 淮北市| 浑源县| 册亨县| 内江市|