2013-12-18 5 views
2

У меня есть раскрывающееся меню, которое создается с помощью javascript и html. У меня есть код, который я буду размещать ниже, который проходит через этот список и должен потенциально удалить любые пустые строки, но не работает. «$ maxfield1rows» имеет значение 7, я говорю, что если значение пустое (== ''), то удалите его. Я использовал removeChild, но это, похоже, не работает, я также попробовал сращивание, я думаю, фильтр может работать, но я не уверен. Я попробовал отключить = true, но это просто делает их отключенными и невыбираемыми. Кто-то может помочь?Как удалить пустые строки в массиве, сгенерированном в раскрывающемся списке

for(index=1; index<$maxfield1rows; index++) { 
    if(document.pickDivision.field1.options[index].value=='') {  
document.pickDivision.field1.removeChild(document.pickDivision.field1.options[index]); 
    } 
} 

Обновлен ниже, я использую $ maxfield1rows, так что сумма максимального количества строк, цикл проходит, также в результате изменения я имел в виду, что есть OnChange событие, которое получает срабатывает, когда пользователь выбирает другой вариант в раскрывающемся меню, так что в зависимости от выбранного варианта вывода для FIELD1 изменений, иногда 5 значений, которые показывают, а иногда и просто 1:

for(index=$maxfield1rows-1; index>=0; index--) { 
    alert(document.pickDivision.field1.options[index]); 
    if(document.pickDivision.field1.options[index].value==''){ 
     document.pickDivision.field1.removeChild(document.pickDivision.field1.options[index]);    
     document.pickDivision.field1.options[index].disabled=true; 
    } 
    else{ 
     document.pickDivision.field1.options[index].disabled=false; 
    } 
} 
+0

Если вы делаете 'console.log ('а' + document.pickDivision.field1.options [индекс] .value + 'б')', есть пространство между а и Ь или нет пространство? – Kyle

+0

Кроме того, перемещение вперед через массив параметров и удаление элементов вызовет проблему в некоторых (если не все) браузерах. Когда этот элемент удален, он по существу удаляется из коллекции 'options'. Это приведет к тому, что ваш следующий элемент не будет находиться в одном месте индекса. – Kyle

+0

Между a и b нет пробела. – niceguy

ответ

1

Чтобы расширить на мой комментарий, я думаю, что вопрос что вы перебираете вперед через массив опций. Я удивлен, что при попытке сделать это не возникает никакой ошибки. Вы должны пройти назад через коллекцию, чтобы не пропускать элемент.

JS Fiddle demonstrating the error. В этом примере элементы 1 и 2 пусты, а пункт 3 - нет.

Эти встроенные коллекции изменяются каждый раз, когда вы добавляете/удаляете элемент. Используя пример в скрипте, мой массив изменяется от [1,2,3] до [2,3] до error no item at index 2.

Looping назад, моя коллекция принимает это изменение: [1,2,3] - [1,3] - [3].

Вот код с комментариями, объясняющий, для чего используются каждая часть цикла for и почему. Вы можете использовать цикл while, если хотите.

//options.length - 1 because arrays are 0 based 
//i >= 0 because you don't want to use a negative index on an array 
//i-- to loop backwards 
for(var i = document.pickDivision.field1.options.length - 1; i >= 0; i--) { 
    //Is this an empty item 
    if(document.pickDivision.field1.options[i].value == '') { 
     //Remove the empty item 
     document.pickDivision.field1.removeChild(document.pickDivision.field1.options[i]); 
    } 
} 

UPDATE

С недавно обновленный код, который вы в курсе, вы пытаетесь получить доступ к опции элемента после того, как он был удален. По внешнему виду линии вам больше не нужно, поскольку вы уже удаляете элемент. Если вы все еще хотите отключить элемент перед его удалением, переместите эту строку над другой линией (см. Комментарий в коде).

for(index=$maxfield1rows-1; index>=0; index--) { 
    alert(document.pickDivision.field1.options[index]); 
    if(document.pickDivision.field1.options[index].value==''){ 
     document.pickDivision.field1.removeChild(document.pickDivision.field1.options[index]);    
     //This line is causing the issue; move it above the previous line or remove it 
     document.pickDivision.field1.options[index].disabled=true; 
    } 
    else{ 
     document.pickDivision.field1.options[index].disabled=false; 
    } 
} 

UPDATE 2

Per вопрос в комментариях, когда вы измените число вариантов 6, ваш код брейки. Это связано с тем, что вы используете строго кодированное значение PHP $maxfield1rows. Поскольку вы уже знаете имя формы и имя поля в форме, я бы рекомендовал вам использовать длину коллекции опций в вашем цикле for, а не этой переменной. Это позволит убедиться, что независимо от того, сколько элементов опции (1, 10, 1000), вы всегда будете прокручивать всю коллекцию.

for(var i = document.pickDivision.field1.options.length - 1; i >= 0; i--) {

+0

Хм ... Я, должно быть, что-то не так, я получаю документ.pickDivision.field1.options [...] является нулевым или не является объектом ' – niceguy

+0

Перед оператором if выполните команду console.log (document. pickDivision.field1.options [I]); '. Посмотрите, если это первый элемент или последний элемент, который печатает нуль. Удостоверьтесь, что у вас есть '-1' при установке' i'. – Kyle

+0

Я только что попробовал, и когда выпадающие нагрузки имеют значения, поэтому мы в порядке, там он показывает «объект» в качестве вывода, но в следующем случае, когда я меняю значение, я получаю «объект», но затем он просто останавливается и дает javascript ошибка. Я думаю, что вы делаете это правильно, должно быть что-то со своей стороны. – niceguy

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