2013-11-06 2 views
0

Я занимаюсь манипулированием таблицами HTML за последние несколько недель, и у меня возникла проблема. Я не знаю, как исправить. Таким образом, сбор строк для таблицы может быть повторен как массив, но если вы много изменили строки, не будут ли эти ID смешаны, и браузер не будет полагаться на идентификаторы как способ повторения над объектами строки? Я сталкиваюсь с проблемой (возможно, из-за отсутствия понимания), когда строки в конечном итоге перестают двигаться или одна строка дублируется поверх другой. Должен ли я каким-то образом обновлять идентификатор строки каждый раз, когда он перемещается? Вот мой источник до сих пор для этой функции.Обновление идентификатора строки при замене строк таблицы HTML

function swap(rOne, rTwo, tblID) { 
    tblID.rows[rOne].setAttribute('style', 'background-color:#FFFFFF'); 
    var tBody = tblID.children[0]; 
    var rowOne; 
    var rowTwo; 
    if (rOne > rTwo) { 
     rowOne = rOne; 
     rowTwo = rTwo; 
    } 
    else { 
     rowOne = rTwo; 
     rowTwo = rOne; 
    }   
    var swapTempOne = tblID.rows[rowOne].cloneNode(true); 
    var swapTempTwo = tblID.rows[rowTwo].cloneNode(true);   
    hiddenTable.appendChild(swapTempOne); 
    hiddenTable.appendChild(swapTempTwo);   
    tblID.deleteRow(rowOne); 
    var rowOneInsert = tblID.insertRow(rowOne); 
    var rowOneCellZero = rowOneInsert.insertCell(0); 
    var rowOneCellOne = rowOneInsert.insertCell(1); 
    var rowOneCellTwo = rowOneInsert.insertCell(2); 
    var rowOneCellThree = rowOneInsert.insertCell(3); 
    rowOneCellZero.innerHTML = hiddenTable.rows[2].cells[0].innerHTML; 
    rowOneCellOne.innerHTML = hiddenTable.rows[2].cells[1].innerHTML; 
    rowOneCellTwo.innerHTML = hiddenTable.rows[2].cells[2].innerHTML; 
    rowOneCellThree.innerHTML = hiddenTable.rows[2].cells[3].innerHTML; 
    tblID.deleteRow(rowTwo); 
    var rowTwoInsert = tblID.insertRow(rowTwo); 
    var rowTwoCellZero = rowTwoInsert.insertCell(0); 
    var rowTwoCellOne = rowTwoInsert.insertCell(1); 
    var rowTwoCellTwo = rowTwoInsert.insertCell(2); 
    var rowTwoCellThree = rowTwoInsert.insertCell(3); 
    rowTwoCellZero.innerHTML = hiddenTable.rows[1].cells[0].innerHTML; 
    rowTwoCellOne.innerHTML = hiddenTable.rows[1].cells[1].innerHTML; 
    rowTwoCellTwo.innerHTML = hiddenTable.rows[1].cells[2].innerHTML; 
    rowTwoCellThree.innerHTML = hiddenTable.rows[1].cells[3].innerHTML;  
    tblID.rows[rowOne].setAttribute('onclick', 'chkThis(event, this)'); 
    tblID.rows[rowTwo].setAttribute('onclick', 'chkThis(event, this)'); 
    for (iHiddenDelete = 2; iHiddenDelete >= 1; iHiddenDelete--) { 
     hiddenTable.deleteRow(iHiddenDelete); 
    } 
} 

EDIT: Добавление HTML для страницы и функции для перемещения между таблицами, которые я подозреваю, что является причиной проблемы.

<body> 
<form>  
<input value="0" type="text" id="cubesum" size="5"/> 
<input value="0" type="text" id="wgtsum" size="5"/> 
</form> 
<form> 
<table id="tblSource"> 
<thead> 
    <tr>   
     <th>&nbsp;</th> 
     <th>Order</th> 
     <th>Cube</th> 
     <th>Weight</th> 
     <th>Move</th> 
    </tr> 
</thead>  
<tbody> 

</tbody> 
</table> 
<button type="button" onclick="move('tblSource','tblTarget')" style="width: 58px">To Trucks (Down)</button> 
<button type="button" onclick="move('tblTarget', 'tblSource')" style="width: 58px">To Orders (Up)</button> 
</form> 
<form> 
<table id="tblTarget"> 
<thead> 
    <tr>   
     <th>&nbsp;</th> 
     <th>Order</th> 
     <th>Cube</th> 
     <th>Weight</th> 
     <th>Move</th> 
    </tr> 
</thead> 
<tbody> 

</tbody> 
</table> 
</form> 
<table id="hiddenTable" style="display: none"> <!--this table is hidden! --> 
<thead> 
    <tr>   
     <th>&nbsp;</th> 
     <th>Order</th> 
     <th>Cube</th> 
     <th>Weight</th> 
     <th>Move</th> 
    </tr> 
</thead> 
<tbody> 

</tbody> 
</table> 
</body> 
</html> 

ФУНКЦИЯ НАЧИНАЕТСЯ ЗДЕСЬ

function move(from, to) { 
    var frTbl = document.getElementById(from); 
    var toTbl = document.getElementById(to);   
    chkArray.length = 0; 
    cbsMove = frTbl.getElementsByTagName('input'); 
    for (var oChk = 0; oChk < cbsMove.length; oChk++) { 
     if (cbsMove[oChk].type == 'checkbox') { 
      if (cbsMove[oChk].checked == true) { 
       var prntRow = cbsMove[oChk].parentNode.parentNode; 
       var prntRowIdx = prntRow.rowIndex; 
       chkArray.push(prntRowIdx); 
       cbsMove[oChk].checked = false; 
      } 
     } 
    } 

    for (iMove = chkArray.length -1; iMove >= 0; iMove--) { 
     var num = chkArray[iMove]; 
     var row = frTbl.rows[num]; 
     var cln = row.cloneNode(true); 
     toTbl.appendChild(cln); 
     frTbl.deleteRow(num); 
    } 
    sum(); 
} 
+0

Что именно должно случиться с этой функцией? Из внешнего вида, это удаление вещей из tblID, добавление его в hiddenTable? И конечный цикл только удаляет одну из строк в hiddenTable ... – Zork

+0

Эта функция меняет местами две строки, перемещая их в скрытую таблицу, а затем обратно. У меня возникли проблемы с использованием insertRow для этого. Главная проблема заключается не в том, что этот метод не работает вообще, а в том, что строки в конечном итоге перепутались и больше не двигаются. Я обнаружил, что это происходит только тогда, когда я перемещаю их на сестринский стол. Затем каким-то образом, когда вы меняете строки, одна из строк окажется внутри тела, а остальные - нет, и она потеряет свои атрибуты. Я отправлю HTML и функцию для перемещения между таблицами. – broguesquadron

ответ

0

Так получается, что моя строка клонирования для перемещения между таблицами причиняли искаженную HTML, где строки не будут больше находиться внутри тегов таблицы тела. Кроме того, не доверяя браузеру отслеживать идентификаторы кнопок и используя идентификаторы кнопок для установки атрибутов на кнопку, также в конечном итоге перекрывается идентификация кнопки. Таким образом, я избавился от клонирования узлов и сделал строку, перемещающуюся между таблицами, вручную и используемую innerHTML, чтобы добавить вызов функции внутри кнопок. После дальнейших размышлений я пришел к выводу, что некоторые люди фактически выполняют функции, которые обрабатывают ВСЕ нажатия кнопок, не вызывая их внутри кнопки и направляют их в нужную функцию в зависимости от идентификатора или других факторов, таких как родительские узлы кнопки. Возможно, это лучше всего. Главным трюком здесь является STICK TO ONE METHOD. Я был повсюду в том, как я манипулировал столами, и это сломало вещи. Вот рабочий источник для тех, кто хочет делать подобные вещи.

 <!DOCTYPE html> 

<html lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta charset="utf-8" /> 

    <style type="text/css"> 
     #selectSource { 
      width: 320px; 
     } 
     #selectTarget { 
      width: 320px; 
     } 
     table, th, td 
     { 
      border: 1px solid black; 
     } 
    </style> 
    <title>Loader</title> 

<script> 
    var chkArray = []; 
    var data = []; 
    var tmpArray = []; 
    var iChk = 0; 
    var swap; 

    window.onload = function() { 

     var load = document.getElementById('selectSource') 

     loadFromAJAX(); 
    } 

    function loadFromAJAX() 
    { 
     var xmlhttp; 
     if (window.XMLHttpRequest) 
      {// code for IE7+, Firefox, Chrome, Opera, Safari 
      xmlhttp=new XMLHttpRequest(); 
      } 
     else 
     {// code for IE6, IE5 
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     xmlhttp.onreadystatechange=function() 
     { 
      if (xmlhttp.readyState==4 && xmlhttp.status==200) 
      { 
       var rawData = xmlhttp.responseText; 
       data = JSON.parse(rawData); 

       for (iData = 0; iData < data.length; iData++) { 
        newRow = document.getElementById('tblSource').insertRow(iData + 1); 
        var dn = "dn" + (iData + 1); 
        var up = "up" + (iData + 1); 
        cel0 = newRow.insertCell(0); 
        cel1 = newRow.insertCell(1); 
        cel2 = newRow.insertCell(2); 
        cel3 = newRow.insertCell(3); 
        cel4 = newRow.insertCell(4); 
        cel0.innerHTML = "<input type='checkbox' name='chkbox'>"; 
        cel1.innerHTML = data[iData].num; 
        cel2.innerHTML = data[iData].cube; 
        cel3.innerHTML = data[iData].wgt; 
        cel4.innerHTML = "<button type='button' onclick=moveUp(this)>up</button><button type='button' onclick=moveDn(this)>down</button>"; 
       } 
      } 
     } 
     xmlhttp.open("POST","http://192.168.3.2/cgi-bin/rims50.cgi/json.p",true); 
     xmlhttp.send(); 
    }  

    function moveUp(mvThisRow) { 
     var mvThisRowRow = mvThisRow.parentNode.parentNode; 
     var mvThisRowTbl = mvThisRowRow.parentNode.parentNode; 
     var mvThisRowIndex = mvThisRowRow.rowIndex; 
     var mvThisRowTblLngth = mvThisRowTbl.rows.length; 
     var mvFrRow = mvThisRowTbl.rows[mvThisRowIndex]; 
     var mvToRow = mvThisRowIndex - 1;   
     var mvThisDn = "dn" + (mvToRow) + mvThisRowTbl; 
     var mvThisUp = "up" + (mvToRow) + mvThisRowTbl; 
     if (mvThisRowIndex - 1 !== 0) { 
      moveToRow = mvThisRowTbl.insertRow(mvToRow); 
      mvRowCel0 = moveToRow.insertCell(0); 
      mvRowCel1 = moveToRow.insertCell(1); 
      mvRowCel2 = moveToRow.insertCell(2); 
      mvRowCel3 = moveToRow.insertCell(3); 
      mvRowCel4 = moveToRow.insertCell(4); 
      mvRowCel0.innerHTML = "<input type='checkbox' name='chkbox'>"; 
      mvRowCel1.innerHTML = mvFrRow.cells[1].innerHTML; 
      mvRowCel2.innerHTML = mvFrRow.cells[2].innerHTML; 
      mvRowCel3.innerHTML = mvFrRow.cells[3].innerHTML; 
      mvRowCel4.innerHTML = "<button type='button' onclick=moveUp(this)>up</button><button type='button' onclick=moveDn(this)>down</button>"; 
      mvThisRowTbl.deleteRow(mvThisRowIndex +1); 
     } 
     else { 
      alert("You can't move the top row 'up' try moving it 'down'."); 
     } 

    } 

    function moveDn(mvThisRow) { 
     var mvThisRowRow = mvThisRow.parentNode.parentNode; 
     var mvThisRowTbl = mvThisRowRow.parentNode.parentNode; 
     var mvThisRowTblLngth = mvThisRowTbl.rows.length; 
     var mvThisRowIndex = mvThisRowRow.rowIndex;   
     if (mvThisRowIndex + 1 !== mvThisRowTblLngth) { 
      var mvFrRow = mvThisRowTbl.rows[mvThisRowIndex]; 
      var mvToRow = mvThisRowIndex + 2; 
      var moveToRow = mvThisRowTbl.insertRow(mvToRow); 
      var dn = "dn" + (mvToRow) + mvThisRowTbl; 
      var up = "up" + (mvToRow) + mvThisRowTbl; 
      mvRowCel0 = moveToRow.insertCell(0); 
      mvRowCel1 = moveToRow.insertCell(1); 
      mvRowCel2 = moveToRow.insertCell(2); 
      mvRowCel3 = moveToRow.insertCell(3); 
      mvRowCel4 = moveToRow.insertCell(4);    
      mvRowCel0.innerHTML = "<input type='checkbox' name='chkbox'>"; 
      mvRowCel1.innerHTML = mvFrRow.cells[1].innerHTML; 
      mvRowCel2.innerHTML = mvFrRow.cells[2].innerHTML; 
      mvRowCel3.innerHTML = mvFrRow.cells[3].innerHTML; 
      mvRowCel4.innerHTML = "<button type='button' onclick=moveUp(this)>up</button><button type='button' onclick=moveDn(this)>down</button>"; 
      mvThisRowTbl.deleteRow(mvThisRowIndex); 
     } 
     else { 
      alert("You can't move the bottom row 'down' try moving it 'up'."); 
     } 
    } 

    function sum() { 
     var trgTbl = document.getElementById('tblTarget'); 
     var tblLength = trgTbl.rows.length; 
     var sumAddCube = 0; 
     var sumAddWgt = 0; 
     document.getElementById("cubesum").setAttribute("value", sumAddCube); 
     document.getElementById("wgtsum").setAttribute("value", sumAddWgt); 

      for (iSum = 1; iSum < tblLength; iSum++) { 
       celCubeNum = trgTbl.rows[iSum].cells[2].innerHTML; 
       celWgtNum = trgTbl.rows[iSum].cells[3].innerHTML; 
       sumAddCube = parseInt(sumAddCube) + parseInt(celCubeNum); 
       sumAddWgt = parseInt(sumAddWgt) + parseInt(celWgtNum); 
      } 
     document.getElementById("cubesum").setAttribute("value", sumAddCube); 
     document.getElementById("wgtsum").setAttribute("value", sumAddWgt); 
    } 

    function move(from, to) { 
     var frTbl = document.getElementById(from); 
     var toTbl = document.getElementById(to);   
     chkArray.length = 0; 
     cbsMove = frTbl.getElementsByTagName('input'); 
     for (var oChk = 0; oChk < cbsMove.length; oChk++) { 
      if (cbsMove[oChk].type == 'checkbox') { 
       if (cbsMove[oChk].checked == true) { 
        var prntRow = cbsMove[oChk].parentNode.parentNode; 
        var prntRowIdx = prntRow.rowIndex; 
        chkArray.push(prntRowIdx); 
        cbsMove[oChk].checked = false; 
       } 
      } 
     } 

     for (iMove = chkArray.length -1; iMove >= 0; iMove--) { 
      var num = chkArray[iMove]; 
      var row = frTbl.rows[num]; 
      var toRow = toTbl.rows.length 
      moveRow = toTbl.insertRow(toRow); 
      var dn = "dn" + (toRow) + toTbl; 
      var up = "up" + (toRow) + toTbl; 
      mvCel0 = moveRow.insertCell(0); 
      mvCel1 = moveRow.insertCell(1); 
      mvCel2 = moveRow.insertCell(2); 
      mvCel3 = moveRow.insertCell(3); 
      mvCel4 = moveRow.insertCell(4); 
      mvCel0.innerHTML = "<input type='checkbox' name='chkbox'>"; 
      mvCel1.innerHTML = row.cells[1].innerHTML; 
      mvCel2.innerHTML = row.cells[2].innerHTML; 
      mvCel3.innerHTML = row.cells[3].innerHTML; 
      mvCel4.innerHTML = "<button type='button' onclick=moveUp(this)>up</button><button type='button' onclick=moveDn(this)>down</button>"; 
      frTbl.deleteRow(num);    
     } 
     sum(); 
    } 

</script> 
</head> 
<body> 
    <form>  
<input value="0" type="text" id="cubesum" size="5"/> 
<input value="0" type="text" id="wgtsum" size="5"/> 
</form> 
<form> 
<table id="tblSource"> 
<thead> 
    <tr>   
     <th>&nbsp;</th> 
     <th>Order</th> 
     <th>Cube</th> 
     <th>Weight</th> 
     <th>Move</th> 
    </tr> 
</thead>  
<tbody> 

</tbody> 
</table> 
<button type="button" onclick="move('tblSource','tblTarget')" style="width: 58px">To Trucks (Down)</button> 
<button type="button" onclick="move('tblTarget', 'tblSource')" style="width: 58px">To Orders (Up)</button> 
</form> 
<form> 
<table id="tblTarget"> 
<thead> 
    <tr>   
     <th>&nbsp;</th> 
     <th>Order</th> 
     <th>Cube</th> 
     <th>Weight</th> 
     <th>Move</th> 
    </tr> 
</thead> 
<tbody> 

</tbody> 
</table> 
</form> 
<table id="hiddenTable" style="display: none"> <!--this table is hidden! --> 
<thead> 
    <tr>   
     <th>&nbsp;</th> 
     <th>Order</th> 
     <th>Cube</th> 
     <th>Weight</th> 
     <th>Move</th> 
    </tr> 
</thead> 
<tbody> 

</tbody> 
</table> 
</body> 
</html> 
+0

Моя одна жалоба заключается в том, что это кажется немного подробным. Если бы кто-нибудь мог сказать мне более правильный и лаконичный способ выполнить это, я был бы очень обязан. – broguesquadron

Смежные вопросы