Studying Java......

          統(tǒng)計(jì)

          留言簿(1)

          積分與排名

          JavaServerFaces

          Mail Link

          Open Source

          友情鏈接

          收藏的鏈接

          閱讀排行榜

          評論排行榜

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

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


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


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


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


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


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


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


          7.應(yīng)該說到這里基本已經(jīng)完成了,但在提交到服務(wù)器校驗(yàn)出錯后,返回的頁面中顯示的仍然是編輯前的值,由于頁面做了刷新,隱藏域的值已經(jīng)被重置.如果再切換到其它行,顯示的仍然是用戶修改后的數(shù)據(jù),這部分?jǐn)?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)航:
           
          主站蜘蛛池模板: 盐源县| 桐柏县| 探索| 依安县| 时尚| 牙克石市| 汶川县| 汪清县| 岳阳县| 福建省| 南川市| 襄汾县| 繁昌县| 成都市| 青铜峡市| 砚山县| 咸阳市| 贡嘎县| 江孜县| 孟州市| 内黄县| 宜昌市| 丰城市| 深州市| 沙河市| 疏勒县| 关岭| 香格里拉县| 新沂市| 杂多县| 武陟县| 武功县| 江都市| 拉萨市| 鹿邑县| 馆陶县| 易门县| 五家渠市| 广昌县| 璧山县| 平安县|