2016-11-20 3 views
1

У меня есть два выпадающих меню с идентификатором validKeys1 и validKeys2. Я пытаюсь заполнить выпадающие списки из массива, используя приведенный ниже код javascript, но он заполнит только validKeys2. Как использовать один и тот же фрагмент javascript для нескольких идентификаторов?Как применить javascript к нескольким идентификаторам?

var validKeys1 = document.getElementById("validKeys1"); 
var validKeys2 = document.getElementById("validKeys2"); 

for(var i = 0; i < validCoursesKeys.length; i++) { 
    var opt = validCoursesKeys[i]; 
    var el = document.createElement("option"); 
    el.textContent = opt; 
    el.value = opt; 
    validKeys1.appendChild(el); 
    validKeys2.appendChild(el); 
} 
+0

вы должны создать 'option' для каждого« validKey », вы не можете использовать один элемент HTML в двух местах (appendChild« переместит »элемент из текущего местоположения туда, где вы его добавляете - вот почему только validKeys2 заканчивается опциями) –

ответ

1

Вы можете использовать общий class вместо и cloneNode дублировать узел el каждый раз, когда вы добавляете его:

var validKeys = document.getElementsByClassName("validKeys"); 

for(var i = 0; i < validCoursesKeys.length; i++) { 
    var opt = validCoursesKeys[i]; 
    var el = document.createElement("option"); 
    el.textContent = opt; 
    el.value = opt; 

    for(var j = 0; j < validKeys.length; j++) { 
     validKeys[j].appendChild(el.cloneNode(true)); 
    } 
} 

Надеется, что это помогает.

var validCoursesKeys = ['opt 1','opt 2','opt 3','opt 4'] 
 
var validKeys = document.getElementsByClassName("validKeys"); 
 

 
for(var i = 0; i < validCoursesKeys.length; i++) { 
 
    var opt = validCoursesKeys[i]; 
 
    var el = document.createElement("option"); 
 
    
 
    el.textContent = opt; 
 
    el.value = opt; 
 

 
    for(var j = 0; j < validKeys.length; j++) { 
 
    validKeys[j].appendChild(el.cloneNode(true)); 
 
    } 
 
}
<select class="validKeys"></select> 
 
<select class="validKeys"></select> 
 
<select class="validKeys"></select>

+0

Спасибо. Я изначально пытался сделать это с помощью 'class' следующим образом: https://jsfiddle.net/ndo1xrmk/, но это, очевидно, неправильно ..... как HTML должен искать это для работы? (Извините, новичок в HTML/JS. Используется как три дня) – stumpylumpy

+0

Использование класса не является решением - это 'clone', который решает проблему –

+0

@JaromandaX прав, основная идея заключается в клонировании узла' el 'поэтому мы можем добавить его в несколько списков, но IMO, использующий класс в этом случае, более эффективен, чем идентификаторы. –

1

Ваш код фактически Добавляя опции элемента в validKeys1, а затем изменить его родителя validKeys2. Это должно работать так, как вы ожидали.

var validKeys1 = document.getElementById("validKeys1"); 
var validKeys2 = document.getElementById("validKeys2"); 

for(var i = 0; i < validCoursesKeys.length; i++) { 
    var opt = validCoursesKeys[i]; 
    var el = document.createElement("option"); 
    el.textContent = opt; 
    el.value = opt; 
    validKeys1.appendChild(el); 
    var el2 = el.cloneNode(false); 
    validKeys2.appendChild(el2); 
} 
2

appendChild() принимает элемент, который передается и движется его в родительский элемент. Значение, если оно уже внутри одного элемента, оно удаляется оттуда и помещается в другое.

Вы можете сделать целый новый элемент или использовать cloneNode(), чтобы добавить в ваш второй выбор

validKeys1.appendChild(el); 
validKeys2.appendChild(el.cloneNode(true)); 
1

это может быть также полезно, используя метод Foreach на массиве

var validKeys1 = document.getElementById("validKeys1"); 
var validKeys2 = document.getElementById("validKeys2"); 
[validKeys1, validKeys2].forEach((ids) => { 
    validCoursesKeys.forEach((courses) => { 
     var opt = courses 
     var el = document.createElement('option'); 
     el.textConent = opt; 
     el.value = opt; 
     ids.appendChild(el) 
    }) 
}) 
Смежные вопросы