Studying Java......

          統(tǒng)計

          留言簿(1)

          積分與排名

          JavaServerFaces

          Mail Link

          Open Source

          友情鏈接

          收藏的鏈接

          閱讀排行榜

          評論排行榜

          不刷新頁面,切換表格的編輯狀態(tài)

                前段時間做了一個簡單的維護界面,包括添加,變更與刪除的功能.變更界面是在頁面中顯示一個TABLE(第一列為RadioButton),選中一行后該行變成可編輯狀態(tài),切換到其它行后再恢復(fù)成文本顯示.最初做的時候是點擊單選項按鈕后提交到后臺刷新頁面來實現(xiàn)的,后來要求改成在客戶端切換編輯狀態(tài).


          1.首先需要解決的是由文本顯示狀態(tài)與TEXT框轉(zhuǎn)換的問題.由文本顯示到編輯框這個可以通過修改對應(yīng)對象的innerHTML來解決,由編輯框切換到文本顯示開始用的是outerHTML來修改的(后來發(fā)現(xiàn)有問題).


          2.行切換的問題:當(dāng)選擇的行做了變換時,如果數(shù)據(jù)做了更改且未提交的話仍顯示未修改前的值.這個在頁面中加入了一個隱藏域,保存選中行的數(shù)據(jù).這部分數(shù)據(jù)只是用來臨時保存數(shù)據(jù)的,不需要提交到后臺,未包含在FORM中,只是給了一個ID進行區(qū)分;


          3.選中的行并不是所有字段都更改為可編輯狀態(tài),只有部分字段需要更改.這里在修改innerHTML的時候進行了判斷;


          4.如何與FORM中的屬性匹配的問題:可以在修改innerHTML的時候指定name就可以了;


          5.后來在接下來的測試中,如果字段中存在HTML字符,通過outerHTML來賦值,瀏覽器會對它進行解析,并不是想要顯示的信息.開始查JS函數(shù)的時候發(fā)現(xiàn)了escape與 unescape,以為會進行自動轉(zhuǎn)換的,后來發(fā)現(xiàn)并非如此.在經(jīng)過幾番修改之后,發(fā)現(xiàn)修改outerText屬性則不會對賦的值進行解析.


          6.由于一些驗證是定義在后臺的,只有提交到服務(wù)器后才會進行校驗.如果檢驗不通過還返回當(dāng)前頁面,要保留提交前的狀態(tài);這里是給RadioButton一個ID(后臺數(shù)據(jù)表中的主鍵值).找到對應(yīng)的行,再把把它置成選中狀態(tài),同時相應(yīng)的列改為編輯框;


          7.應(yīng)該說到這里基本已經(jīng)完成了,但在提交到服務(wù)器校驗出錯后,返回的頁面中顯示的仍然是編輯前的值,由于頁面做了刷新,隱藏域的值已經(jīng)被重置.如果再切換到其它行,顯示的仍然是用戶修改后的數(shù)據(jù),這部分數(shù)據(jù)并未成功更新到后臺,應(yīng)該顯示成修改前的數(shù)據(jù).這里通過Request傳回到頁面中,在觸發(fā)對應(yīng)的RadioButton后再把值賦到隱藏域中.

          部分代碼如下:

          <script language="JavaScript" type="text/javascript">
          //Get parent node.
          window.SearchByTagName = function(e, TAG) {
              while(e!=null && e.tagName){
               if(e.tagName==TAG.toUpperCase()) {
                return(e);
               } 
               e = e.parentNode;
              }
              return null;
          }

          var selectedRow = -1; //global

          function selectChanged(e) {
              var td = SearchByTagName(e, "TD");
              var tr = td.parentNode;
              var tab = SearchByTagName(tr, "TABLE");
              var cellValue = "";
              //Reset the cell's value.
              if(selectedRow>=0) {
               for(var i=td.cellIndex+1; i<tab.rows[selectedRow].cells.length; i++) {
                      var a = tab.rows[selectedRow].cells[i].getElementsByTagName("INPUT");
                      for(var k=0; k<a.length; k++) {
                          if(a[k].type=="text") {
                           //Valid only in IE.
                           a[k].outerText = document.getElementById(a[k].name).value;
                          }
                      }
                  }
              } 
            
              selectedRow = tr.rowIndex;
           
           //Change the cell into text,and save the value into hidden field.
              var hyoujijunCell = document.getElementById("hyoujijun" + selectedRow);
              var ryakusyouCell = document.getElementById("ryakusyou" + selectedRow);
              var nameCell = document.getElementById("name" + selectedRow);
              
              document.getElementById("hyoujijun").value=rtrim(hyoujijunCell.innerText);
              document.getElementById("hyoujijun" + selectedRow).innerHTML =
               "<input type='text' name='hyoujijun' maxlength='3' style='width:80px' value='" +
                rtrim(hyoujijunCell.innerHTML) +"'>";
              
               document.getElementById("ryakusyou").value=rtrim(ryakusyouCell.innerText);
               document.getElementById("ryakusyou" + selectedRow).innerHTML =
                "<input type='text' name='ryakusyou' maxlength='4' style='width:60px' value='" +
                rtrim(ryakusyouCell.innerHTML) +"'>";
             
              document.getElementById("name").value= rtrim(nameCell.innerText);
              document.getElementById("name" + selectedRow).innerHTML =
               "<input name='name' maxlength='100' style='width:300px' value='" +
               rtrim(nameCell.innerHTML) +"'>";
          }

          function validReturn() {
           if ( <%=selectedMasterID%> > 0) {
            //Get the selected row,and select it.
            var radioSn = document.getElementById("masterid<%=selectedMasterID%>");
            radioSn.click( );
            //Save original value.If changed other row,restore data as before modified.
            document.getElementById("hyoujijun").value = "<%=hyoujijunReturn%>";
            document.getElementById("name").value = "<%=nameReturn%>";
            document.getElementById("ryakusyou").value = "<%=ryakusyouReturn%>";
           }
          }

          //Clear the last blank.
          function rtrim(cellValue) {
           if (cellValue.lastIndexOf(" ") >= 0) {
            cellValue = cellValue.substr(0,cellValue.lastIndexOf(" "));
           }
           
           return cellValue; 
          }
          </script>


          <body class="gyomu" onload="validReturn()">
          <table>
            <logic:present name="masterList">
             <logic:iterate id="element" indexId="index" name="masterList">
              <tr>
               <td class="meisai" style="width: 50px">
                <logic:notEqual name="element" property="sakujyo" value="DELETE">
                 <input type="radio" name="masterid"
                  value="<bean:write name='element' property='masterid'/>"
                  onclick="selectChanged(this)" id="masterid<bean:write name='element' property='masterid'/>" />
                 <%rowCount++;%>  
                </logic:notEqual>
               </td>
               <td class="meisai" style="width: 80px" id="hyoujijun<%=index%>">
                <bean:write name="element" property="hyoujijun" />
               </td>
               <td class="meisai" style="width: 60px" id="cd<%=index%>">
                <bean:write name="element" property="cd" />
               </td>
               <td class="meisai" style="width: 300px" id="name<%=index%>">
                <bean:write name="element" property="name" />
               </td>
               <logic:equal name="needShortName" value="true">
                <td class="meisai" style="width: 60px" id="ryakusyou<%=index%>">
                 <bean:write name="element" property="ryakusyou" />
                </td>
               </logic:equal>
               <td class="meisai" style="width: 70px" id="sakujyo<%=index%>">
                <bean:write name="element" property="sakujyo" />
               </td>
              </tr>
             </logic:iterate>
            </logic:present>
           </table>
          </body>

          posted on 2005-12-08 11:46 Terence 閱讀(2350) 評論(2)  編輯  收藏 所屬分類: 其它

          評論

          # re: 不刷新頁面,切換表格的編輯狀態(tài) 2006-03-09 09:35 solar

          如果是mozilla瀏覽器可能就不支持SearchByTagName了  回復(fù)  更多評論   

          # re: 不刷新頁面,切換表格的編輯狀態(tài)[未登錄] 2009-02-13 10:51 lx

          能給一個完整的代碼嗎  回復(fù)  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 泸州市| 保康县| 石泉县| 武义县| 沙坪坝区| 班戈县| 潜山县| 谢通门县| 交口县| 丹阳市| 江油市| 孝义市| 嘉善县| 且末县| 乌兰浩特市| 肃北| 康保县| 明溪县| 平阴县| 江山市| 响水县| 亳州市| 大安市| 台中县| 瑞安市| 日照市| 肇东市| 冀州市| 桃江县| 义乌市| 西乡县| 普陀区| 神农架林区| 葵青区| 耒阳市| 油尖旺区| 余干县| 县级市| 甘南县| 安陆市| 拉孜县|