風人園

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

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

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

                  第二種: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的回調(diào)函數(shù)
          根據(jù)傳入的json格式,賦值相應的域值

          cmp:string 域id
          retval :json 所選行的數(shù)據(jù)
          無返回
          */

          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上的參數(shù)
          返回: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;
          }
                      

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

          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,并通過循環(huán)域id從返回值中獲取數(shù)據(jù),并進行賦值。

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

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

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

          主站蜘蛛池模板: 海门市| 台东县| 灵川县| 石景山区| 古交市| 沧州市| 蕲春县| 稷山县| 固原市| 华池县| 彩票| 琼中| 喀喇沁旗| 武鸣县| 北流市| 江都市| 宁安市| 时尚| 新竹县| 隆德县| 灵川县| 北安市| 互助| 蕉岭县| 宜春市| 满洲里市| 陆丰市| 新绛县| 竹山县| 崇明县| 吉隆县| 玉树县| 疏附县| 平陆县| 吉首市| 伊宁县| 库伦旗| 监利县| 绥宁县| 北流市| 湘阴县|