javascript - 使用哪个事件来添加选择中的选项?

标签 javascript dom

我想要的是带有 html select 元素的 onchange 事件。但显然更改事件是针对选择中的选项的。我需要检测何时添加新选项。

我搜索过谷歌和 SO以及其中的链接,但我不想使用任何框架。

我阅读了有关创建事件的内容,但我不明白如何使用创建的事件“onAdded”。就像 select.onAdded -> select 如何知道添加了某些内容(选项)?

或者有一个我忽略的更简单的方法吗?我错过了一个事件吗?

我的观点是,我想做这样的事情

var select = document.getElementById("slct");

var btn =  document.getElementById("btn");
btn.addEventListener("click", () => {
	var option = document.createElement("option");
	option.text = `${select.length} please work!`;
	select.add(option );
  //!!!select optionAdded event should have triggered!!!
})

function addPoint(){
  //do things
}

/*
select.addEventListener("optionAdded", addPoint);
or
onSelectValueCountChanged(appropriateFunctionHere);
*/
<form>
  <select id="slct" style="width: 300px" mutiple="true" size="11">  
  </select>
  
  <button type="button" id="btn">click
  </button>
  
</form>

这可能吗?以一种易于理解(我是 js 新手)的方式,无需任何框架?

最佳答案

您可以创建自定义事件并在 select 元素上触发它。这是我前一段时间使用的代码。它应该得到很好的支持,但现在不能告诉你具体的信息。

function triggerCustomEvent(element, eventType, eventProperties) {
  let event;

  // a cross-browser way to create an event object
  // don't know which branch is for which
  if (document.createEvent) {
    event = document.createEvent('HTMLEvents');
    event.initEvent(eventType, true, true);
  } else {
    event = document.createEventObject();
    event.eventType = eventType;
  }

  // also for being cross-browser
  event.eventName = eventType;

  // events are just objects, we can add properties to them, so we extend it
  // with our custom properties if any
  if (eventProperties && typeof eventProperties === "object") {
    for (var property in eventProperties) {
      event[property] = eventProperties[property];
    }
  } 

  // cross-browser way of firing the actual event object on the given element
  if (document.createEvent) {
    element.dispatchEvent(event);
  } else {
    element.fireEvent('on' + event.eventType, event);
  }
}

你可以像这样使用它

triggerCustomEvent(select, "onoptionadded", { options: opt });

如果您想向触发的事件对象添加一些属性,则第三个参数是可选的。

如果你想走这条路,你应该引入一个添加选项的方法,这样你就可以确保你总是触发这个事件。

function addOption(select, option) {
  select.add(option);
  triggerCustomEvent(select, "onoptionadded", { options: option });
}

请注意,该代码片段仅用于示例目的,尚未经过广泛测试,您不应该只是复制粘贴它。

关于javascript - 使用哪个事件来添加选择中的选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40730923/

相关文章:

javascript - 如何追踪鼠标移动的距离?

javascript - 有没有办法获取canvas的子元素?

javascript - 如何使用变量调用对象属性?

javascript - 循环 JavaScript

javascript - 自动填充不会触发 onChange

javascript - Google App Script 突然无法在以前可以工作的电子表格中工作。未找到字体

javascript - 绘制 DOM "pseudo"行

javascript - 使用 Doctype 让 scrollTop 返回 0,为什么?

javascript - 使用 jQuery 通过给定的 id 更新表行

javascript - 为什么jQuery或诸如getElementById之类的DOM方法找不到元素?