我正在开发一个小项目,我有一个包含12个节点的图表,用户通过下拉菜单为每个节点分配值。因为我不想重复代码,所以在jquery中发现了一个循环,它根据我的需要多次克隆下拉菜单。但是,当与javascript函数showData结合使用以显示所选值时,我得到一个错误,即数组未定义。我怀疑它与jquery函数如何将克隆附加到无序列表有关,因为showData函数在下拉菜单的一个实例上工作得很好。话虽如此,我不确定如何继续。这是我正在使用的代码。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<div class = "menu">
<form name="nodeForm">
<ul>
<li class="template">Node <span class="qnum">1</span>:
<select id="select" onchange="showData()">
<option value="" disabled selected>select a note for this node</option>
<option val="1">"A"</option>
<option val="2">"A# / B♭"</option>
<option val="3">"B"</option>
<option val="4">"C"</option>
<option val="5">"C# / D♭"</option>
<option val="6">"D"</option>
<option val="7">"D# / E♭"</option>
<option val="8">"E"</option>
<option val="9">"F"</option>
<option val="10">"F# / G♭"</option>
<option val="11">"G"</option>
<option val= "12"> "G# / A♭"</option>
</select>
</li>
</ul>
</form>
</div>
<p id="firstP"> </p>
<script>
//jquery for 12 node dropdown
$(function() {
var $ul = $("ul"),
$li = $ul.find("li.template"),
i;
for (i=2; i <= 12; i++)
$li.clone().appendTo($ul).find("span.qnum").text(i);
var v = $("#select").val(); //trying to get data with jquery
console.log(v);
});
//getting the data with js
function showData()
{
var theSelect = nodeForm.select;
var firstP = document.getElementById('firstP');
var secondP = theSelect[theSelect.selectedIndex].value;
var thirdP = theSelect[theSelect.selectedIndex].text;
firstP.innerHTML = ('This option\'s index number is: ' + theSelect.selectedIndex + ' (Javascript index numbers start at 0)');
}
</script>
</body>
</html>
答案 0 :(得分:0)
问题在于,在复制模板时,您现在有12个选择元素都具有相同的ID,“选择”。所以“theSelect”被设置为一个数组,因此theSelect.selectedIndex是未定义的。
在onchange事件中,您可以获取受影响的元素,然后使用该元素:
<select id="select" onchange="showData(event)">
...
function showData(e)
{
var index = e.target.selectedIndex;
firstP.innerHTML = ('This option\'s index number is: ' + index + ' (Javascript index numbers start at 0)');
}
答案 1 :(得分:0)
也许是这样的:
HTML:
<ul></ul>
的javascript:
let html = '';
for (let i = 1; i <= 12; ++i) {
html+= `
<li>Node <span class="qnum">${i}</span>:
<select>
<option>select a note for this node</option>
<option val="1">"A"</option>
<option val="2">"A# / B♭"</option>
<option val="3">"B"</option>
<option val="4">"C"</option>
<option val="5">"C# / D♭"</option>
<option val="6">"D"</option>
<option val="7">"D# / E♭"</option>
<option val="8">"E"</option>
<option val="9">"F"</option>
<option val="10">"F# / G♭"</option>
<option val="11">"G"</option>
<option val= "12"> "G# / A♭"</option>
</select>
<span>(index selected is <span class="selected">0</span>)</span>
</li>`;
}
$('ul').append(html);
$('select').on('change', function() {
$(`span.selected:eq(${$('select').index(this)})`).text(this.options.selectedIndex)
});
https://jsfiddle.net/47bcvvn2/2/
.clone()
往往会遇到奇怪的问题。相反,这会生成整个html,然后将其添加到DOM。
$('select').index(this)
- 这将根据所有可用选项返回已更改的选择的索引。如果你想缩小它并且能够在其他地方使用其他选择,你可以给出一个选择一个类的集合。
this.options.selectedIndex
- 这将返回所选选项的索引,无论选择哪个选项。以来
this
是触发change
事件的选择。