链接的下拉菜单

时间:2019-01-05 17:43:35

标签: javascript html

我正在尝试创建2个下拉菜单,其中第一个列表链接到第二个列表(每次我在第一个列表中选择某项时,第二个列表都会更新)。 我有一些有效的代码,但对我来说似乎有些混乱。

仅在脚本位于正文中时有效。如果我将其移至头部,则无法使用。

为什么? 可以通过其他方式(例如,仅使用Javascript使用2d数组)来实现同一事物吗?

var sel1 = document.querySelector('#sel1');
var sel2 = document.querySelector('#sel2');
var options2 = sel2.querySelectorAll('option');

function giveSelection(selValue) {
  sel2.innerHTML = '';
  for (var i = 0; i < options2.length; i++) {
    if (options2[i].dataset.option === selValue) {
      sel2.appendChild(options2[i]);
    }
  }
}
giveSelection(sel1.value);
<h1><b>Title</b></h1>
<select id="sel1" onchange="giveSelection(this.value)">
  <option value="0"></option>
  <option value="a">a</option>
  <option value="b">b</option>
</select>
<select id="sel2">
  <option data-option="a">apple</option>
  <option data-option="a">airplane</option>
  <option data-option="b">banana</option>
  <option data-option="b">book</option>
</select>

2 个答案:

答案 0 :(得分:0)

是的。它不起作用。因为当脚本在头部时。执行时,#self1对象和#sel2 DOM元素不在DOM上。在正文部分中时,会在DOM上创建DOM元素。使其工作的一种方法是将那些引用元素的变量引入函数内部,如下所示。

function giveSelection(selValue) {
  var sel1 = document.querySelector('#sel1');
  var sel2 = document.querySelector('#sel2');
  var options2 = sel2.querySelectorAll('option');
  sel2.innerHTML = '';
  for (var i = 0; i < options2.length; i++) {
    if (options2[i].dataset.option === selValue) {
      sel2.appendChild(options2[i]);
    }
  }
}

相信我,这不是一种有效的方法。最佳做法是在页面底部添加javascript,在页面顶部添加CSS。可以在主体部分的底部包含脚本。

答案 1 :(得分:0)

为了从头开始使用该脚本,您需要使用window.onload,该命令在DOM准备就绪时将触发。

根据您的情况,您可以执行以下操作:

<head>
  <script>
const load = () => {
  sel1 = document.querySelector('#sel1');
  sel2 = document.querySelector('#sel2');
  options2 = sel2.querySelectorAll('option');
  giveSelection(sel1.value);
} 
function giveSelection(selValue) {
  sel2.innerHTML = '';
  for (var i = 0; i < options2.length; i++) {
    if (options2[i].dataset.option === selValue) {
      sel2.appendChild(options2[i]);
    }
  }
}
window.onload = load; 
  </script>
</head>

codepen