将点击事件绑定到多个 <options> 元素

Bind a click event to multiple <options> elements

我有一个 select 菜单,我想将一个单击事件绑定到每个 <option> 元素。这样做的目的是在 <option> 元素为 clicked/selected 时向其添加 class。这是我的 html 和 Javascript。我缺少 select <option> 元素并将事件绑定到它们的方法。我们将不胜感激。

Html:

<div class="row">
  <div class="small-12 columns">
    <label>Select Menu
      <select id="SelectMenu">
        <option value="husker">Husker</option>
        <option value="starbuck">Starbuck</option>
        <option value="hotdog">Hot Dog</option>
        <option value="apollo">Apollo</option>
      </select>
    </label>
  </div>
</div>

Javascript

function myFunction() {
  console.log("Click Event");
}
var options = document.getElementById('SelectMenu');
for ( var i = 0; i < options.length; i++ ) {
  console.log(options[i].value);
  options[i].addEventListener('click', myFunction, false)
}

Code example

最好为 select 创建一个事件,然后检查事件中的值

function selectClicked(id){
  console.log(id);
  myFunction() ;
}
function myFunction() {
  console.log("Click Event");
}
var options = document.getElementById('SelectMenu');
options.setAttribute("onchange", function(){selectClicked(options.value);});

让我们看看您的代码做了什么:

function myFunction() {
  console.log("Click Event");
}

很简单,一个函数。

接下来,

var options = document.getElementById('SelectMenu');

因此,options 被分配了 #SelectMenu 元素。好的

for ( var i = 0; i < options.length; i++ ) {
  console.log(options[i].value);
  options[i].addEventListener('click', myFunction, false)
}

现在,你开始有点不对劲了。

您不必为其中的每个 option 元素添加侦听器。

每次 select 另一个选项时,select 元素(yout options 变量)发出一个 change 事件。

所以你可以简单地做

options.addEventListener('change', myFunction)

就是这样。

如果您想知道哪个 option 元素被点击,您还应该为回调函数定义一个事件参数,如下所示

function myFunction(e) {
  //e.target is the <select> element
  console.log(e.target.value);
  console.log("Click Event");
}

向单击的 option 元素添加 class 没有多大意义,因为您无法为它们设置样式。

更新:既然你特别要求将 class 添加到 selected 选项,那么你可以这样做:

function myFunction(e) {
  //e.target is the <select> element
  console.log(e.target.selectedOptions[0]);
  console.log(e.target.value);
  console.log("Click Event");
}

干杯弗雷德里克。