我有一个select下拉列表,在更改时,我希望它运行一个函数并将select的值传递给该函数。但是,该函数期望有一个保存数组的变量,并且传递的是一个字符串(select的值)。
您可以在下面的代码中看到它正常工作(或不正常工作)。所选值应代表其对应的变量。
我该怎么做?
var str = ["Paul", "John", "Melissa", "Mike"];
var int = [8, 4, 55, 7];
var mix = ["Paul", 9, "John", 5, "Melissa", 67, "Mike", 2];
var main = document.querySelector('#main');
var sel = document.querySelector('select');
function testFunc(arr){
arr.forEach((i) => {
var p = document.createElement('p');
p.innerHTML = i;
main.appendChild(p);
});
}
testFunc(mix);
sel.addEventListener('change', testFunc(sel.value));
<select>
<option value="str">String</option>
<option value="int">Integer</option>
<option value="mix">Mixed</option>
</select>
<div id="main"></div>
编辑:
我应该注意,数据数组是动态输入的,我真的想避免对其进行操作,以免在以后的编辑中引起额外的代码和混乱。
答案 0 :(得分:1)
您的代码中有两个问题:
在事件处理函数中,通过在函数之后指定括号,可以在页面加载时调用该函数。只需在函数体内调用函数即可。这将使函数仅在事件触发时被调用。
sel.value
是一个字符串,但是该函数需要一个数组。要评估数组,请动态地将testFunc(mix)
更改为testFunc('mix')
(用引号引起来的参数值)并使用window
对象,如:
arr = window[arr]
替换:
sel.addEventListener('change', testFunc(sel.value));
使用
sel.addEventListener('change', function (){testFunc([sel.value])});
var str = ["Paul", "John", "Melissa", "Mike"];
var int = [8, 4, 55, 7];
var mix = ["Paul", 9, "John", 5, "Melissa", 67, "Mike", 2];
var main = document.querySelector('#main');
var sel = document.querySelector('select');
function testFunc(arr){
arr = window[arr]
arr.forEach((i) => {
var p = document.createElement('p');
p.innerHTML = i;
main.appendChild(p);
});
}
testFunc('mix');
sel.addEventListener('change', function (){testFunc(sel.value)});
<select>
<option value="str">String</option>
<option value="int">Integer</option>
<option value="mix">Mixed</option>
</select>
<div id="main"></div>
答案 1 :(得分:1)
据我了解,您想这样做:
let model = {
str : ["Paul", "John", "Melissa", "Mike"];
int : [8, 4, 55, 7];
mix : ["Paul", 9, "John", 5, "Melissa", 67, "Mike", 2];
}
function testFunc(key){
var arr = []
if(model[key]){
arr = model[key]
}
//TODO: clear parent node...
arr.forEach((i) => {
var p = document.createElement('p');
p.innerHTML = i;
main.appendChild(p);
});
}
答案 2 :(得分:1)
arr = eval(arr);
var str = ["Paul", "John", "Melissa", "Mike"];
var int = [8, 4, 55, 7];
var mix = ["Paul", 9, "John", 5, "Melissa", 67, "Mike", 2];
var main = document.querySelector('#main');
var sel = document.querySelector('select');
function testFunc(arr){
arr = eval(arr);
arr.forEach((i) => {
var p = document.createElement('p');
p.innerHTML = i;
main.appendChild(p);
});
}
testFunc(mix);
sel.addEventListener('change', function(){testFunc(this.value)});
<select>
<option value="str">String</option>
<option value="int">Integer</option>
<option value="mix">Mixed</option>
</select>
<div id="main"></div>
答案 3 :(得分:1)
一些需要更改的地方:
不要调用传递给addEventListener
方法的函数。而是传递一个函数引用。它可以是内联函数表达式。但是不要这样。
为一个对象变量设置不同的数组属性,因此您可以根据选定的值轻松引用它们。
每当更改选择时清除输出。
根据页面加载时选择的项目触发初始更改。
这是一个有效的版本:
var arr = {
str: ["Paul", "John", "Melissa", "Mike"],
int: [8, 4, 55, 7],
mix: ["Paul", 9, "John", 5, "Melissa", 67, "Mike", 2]
};
var main = document.querySelector('#main');
var sel = document.querySelector('select');
function testFunc(arr){
main.innerHTML = ""; // clear the previous result
arr.forEach((i) => {
var p = document.createElement('p');
p.innerHTML = i;
main.appendChild(p);
});
}
sel.addEventListener('change', () => testFunc(arr[sel.value]));
testFunc(arr[sel.value]); // initial load
<select>
<option value="str">String</option>
<option value="int">Integer</option>
<option value="mix">Mixed</option>
</select>
<div id="main"></div>
如果数组是在全局范围内定义的,那么您无能为力,那么只需在新对象中复制对它们的引用即可:
// Defined beforehand: you cannot change this:
var str = ["Paul", "John", "Melissa", "Mike"],
var int = [8, 4, 55, 7],
var mix = ["Paul", 9, "John", 5, "Melissa", 67, "Mike", 2]
// In your part of the code, still create array as in above solution:
var arr = {str: str, int: int, mix: mix};
// If you have ES6 support you can shorten the above to:
var arr = {str, int, mix};
答案 4 :(得分:0)
如果我没有误解您的要求,那么您必须对现有的JS变量进行一些细微的更改,并将其更改为Object
。之后,尝试使用这种方式,通过使用event
main.innerHTML=''
上
addEventListener :https://developer.mozilla.org/en-US/docs/Web/Events/change
对象结构:https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Basics
var data_types = {
str: ["Paul", "John", "Melissa", "Mike"],
int: [8, 4, 55, 7],
mix: ["Paul", 9, "John", 5, "Melissa", 67, "Mike", 2]
}
var main = document.querySelector('#main');
var sel = document.querySelector('select');
function testFunc(event) {
main.innerHTML = '';
// You can use “this” to refer to the selected element.
if (!event.target.value) alert('Please Select One');
var arr = data_types[event.target.value];
arr.forEach((i) => {
var p = document.createElement('p');
p.innerHTML = i;
main.appendChild(p);
});
}
document.addEventListener('DOMContentLoaded', function() {
document.querySelector('select[name="data-types"]').onchange = testFunc;
}, false);
<select name="data-types">
<option value="str">String</option>
<option value="int">Integer</option>
<option value="mix">Mixed</option>
</select>
<div id="main"></div>