2013-02-25 9 views
1

Я пытаюсь написать автономный javascript, где я сначала выбираю (один или несколько) элементов из списка и назначаю свое имя в текстовое поле DBA.Включить отключенные элементы в списке

Это создает записи строк внизу в зависимости от «выбранного». Теперь, когда я «Удалю» строку, я не могу повторно включить элементы удаленного списка. Вот мой код:

<form name="myform" action="" method="get" id="myform"> 
    <table border="1" cellpadding="10" cellspacing="0" id="table1"> 
     <tr> 
      <td valign="top"><input type="button" value="Selected" onclick="addRow();" /> 
       <br /> 
       <select name="selSea" id="selSeaShells" size="5" multiple="multiple"> 
        <option value="ORANGE" selected="selected"> 
        ORANGE 
        </option> 

        <option value="APPLE" selected="selected"> 
        APPLE 
        </option> 

        <option value="GRAPE" selected="selected"> 
        GRAPE 
        </option> 

        <option value="BANANA" selected="selected"> 
        BANANA 
        </option> 

        <option value="TREE" selected="selected"> 
        TREE 
        </option> 

        <option value="TEST" selected="selected"> 
        TEST 
        </option> 

        <option value="NEWS" selected="selected"> 
        NEWS 
        </option> 

        <option value="SKY" selected="selected"> 
        SKY 
        </option> 
       </select> 
      </td> 

      <td valign="top"><input type="text" id="DBA" name="DBA" value="" /> DBA</td> 
     </tr> 
    </table> 
</form> 
<script language="JavaScript" type="text/javascript"> 
    //<![CDATA[ 
    <!-- 

    function addRow() 
    { 
     var tbody = document.getElementById('table1').getElementsByTagName('tbody')[0]; 
     var DBAValuesObj = document.myform.DBA.value; 
     var selectedArray = new Array(); 
     var selObj = document.getElementById('selSeaShells'); 
     var i; 
     var count = 0; 
     for (i=0; i<selObj.options.length; i++) { 
      if (selObj.options[i].selected) { 
       selObj.options[i].disabled = 'disabled'; 
       selectedArray[count] = selObj.options[i].value; 
       count++; 
      } 
     } 
     tbody.value = selectedArray + "." + DBAValuesObj; 

     var row = document.createElement('TR'); 
     var cell1 = document.createElement('TD'); 
     var cell2 = document.createElement('TD'); 
     var inp1 = document.createElement('INPUT'); 
     var inp2 = document.createElement('INPUT'); 
     inp1.setAttribute('type','text'); 
     inp1.setAttribute('name','PartIDArray[]'); 
     inp1.setAttribute('size','15'); 
     inp1.setAttribute('maxlength','20'); 
     inp1.setAttribute('value',''); 

     inp1.setAttribute('value',tbody.value); 

     inp2.setAttribute('type','button'); 
     inp2.setAttribute('value','Delete'); 
     inp2.onclick=function(){delRow(this);} 
     cell1.appendChild(inp1); 
     row.appendChild(cell1); 
     cell2.appendChild(inp2); 
     row.appendChild(cell2); 
     tbody.appendChild(row); 
    } 

    function delRow(button) 
    { 
     var row = button.parentNode.parentNode; 
     var tbody = document.getElementById('table1').getElementsByTagName('tbody')[0]; 


     var selArray = new Array(); 
     var selObject = document.getElementById('selSeaShells'); 
     var i; 
     var count = 0; 
     for (i=0; i<selObject.options.length; i++) { 
      if (selObject.options[i].selected) { 
       selObject.options[i].disabled = ''; 
       selArray[count] = selObject.options[i].value; 
       count++; 
      } 
     } 

    tbody.removeChild(row); 
    } 

    //--> 
    //]]> 
</script> 
+0

Что ты имеешь в виду: «Я не в состоянии включить удаленные элементы списка для повторного». Я вижу, что ваш код работает. Если я удалю, строка будет удалена, и элемент снова появится в списке для выбора. – hop

+0

@hop - Когда вы нажимаете, чтобы добавить элемент, а затем удалите его из добавленного раздела, эти элементы больше не могут быть выбраны (поскольку они отключено) из списка опций. –

ответ

0

Это потому, что ваша логика не так. При повторном включении элементов вы выполняете итерацию по выбранным элементам.

Сценарий 1 - Вы выбираете APPLE. Нажмите «Выбран». Нажмите «Удалить». -> Вы увидите, что APPLE включен.

Сценарий 2 - вы выбираете APPLE. Нажмите «Выбран». Выберите ORANGE. Нажмите «Удалить». -> Вы увидите APPLE NOT включен.

Итак, вам нужно помнить, какие элементы вы удаляете, чтобы включить их. И selObject.options[i].disabled = ''; будет работать. Его технически правильно. Но логика плохая.

Рабочий код:

<form NAME="myform" action="" method="get"> 
<table border="1" cellpadding="10" cellspacing="0" id="table1"> 
<tr> 
<td valign="top"> 
<input type="button" value="Selected" onclick="addRow();" /> 
<br /> 
<select name="selSea" id="selSeaShells" size="5" multiple="multiple"> 
<option value="ORANGE" selected>ORANGE</option> 
<option value="APPLE" selected>APPLE</option> 
<option value="GRAPE" selected>GRAPE</option> 
<option value="BANANA" selected>BANANA</option> 
<option value="TREE" selected>TREE</option> 
<option value="TEST" selected>TEST</option> 
<option value="NEWS" selected>NEWS</option> 
<option value="SKY" selected>SKY</option> 
</select> 
</td> 
<td valign="top"> 
<input type="text" id="DBA" NAME="DBA" VALUE="" /> 
DBA 
</td> 

</tr> 
</table> 
</form> 

<script language="JavaScript" type="text/javascript"> 
<!-- 

function addRow() 
{ 
var tbody = document.getElementById('table1').getElementsByTagName('tbody')[0]; 
var DBAValuesObj = document.myform.DBA.value; 
var selectedArray = new Array(); 
var selObj = document.getElementById('selSeaShells'); 
var i; 
var count = 0; 
for (i=0; i<selObj.options.length; i++) { 
if (selObj.options[i].selected) { 
     selObj.options[i].disabled = 'disabled'; 
selectedArray[count] = selObj.options[i].value; 
     count++; 
} 
} 
tbody.value = selectedArray + "." + DBAValuesObj; 


var row = document.createElement('TR'); 
var cell1 = document.createElement('TD'); 
var cell2 = document.createElement('TD'); 

var inp1 = document.createElement('INPUT'); 
var inp2 = document.createElement('INPUT'); 
inp1.setAttribute('type','text'); 
inp1.setAttribute('name','PartIDArray[]'); 
inp1.setAttribute('size','15'); 
inp1.setAttribute('maxlength','20'); 
inp1.setAttribute('value',''); 

inp1.setAttribute('value',tbody.value); 

inp2.setAttribute('type','button'); 
inp2.setAttribute('value','Delete'); 
inp2.onclick=function(){delRow(this);} 
cell1.appendChild(inp1); 
row.appendChild(cell1); 
cell2.appendChild(inp2); 
row.appendChild(cell2); 

var cell3 = document.createElement('INPUT'); 
cell3.setAttribute('type','HIDDEN'); 
cell3.setAttribute('value',selectedArray); 

row.appendChild(cell3); 

tbody.appendChild(row); 
} 
     function delRow(button) 
{ 
var row = button.parentNode.parentNode; 
var tbody = document.getElementById('table1').getElementsByTagName('tbody')[0]; 


var selArray = new Array(); 
var selObject = document.getElementById('selSeaShells'); 
var i; 
var count = 0; 
for (i=0; i<selObject.options.length; i++) { 
if (selObject.options[i].value.indexOf(row.childNodes[2].value)>-1) { 

     selObject.options[i].disabled = ''; 
     selArray[count] = selObject.options[i].value; 
     count++; 
} 
} 


tbody.removeChild(row); 
} 

//--> 
</script> 
+0

Как исправить эту логику? Я почти там ... Я наклоняю пальцем. – user2108378

+0

Я бы предположил, что у вас есть скрытый в каждой строке, а также ваш текст и кнопка. В ondelete() получите значение этого скрытого, csv. Найдите элементы в списке, чтобы они соответствовали этому значению, и установите disabled = false. – hop

+0

Можете ли вы дать мне пример того, как скрывать в каждой строке и получать значение – user2108378

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