【问题标题】:Is there a way to add Events on Select Option Elements in Chrome?有没有办法在 Chrome 中的选择选项元素上添加事件?
【发布时间】:2016-03-31 05:25:11
【问题描述】:

我正在尝试将自定义样式添加到 <select> 元素,但由于跨浏览器的限制,我需要知道:

  1. 扩展选择下拉列表时(我做了一个快速的谷歌搜索,它似乎似乎可能)
  2. <option> 元素上添加事件

第二个选项似乎适用于除 Chrome 之外的所有浏览器。我宁愿避免做一些讨厌的浏览器检测,所以如果有人有建议,我正在寻找解决这两个选项之一的方法??

以下适用于除 Chrome 以外的所有浏览器:

<select id="gender" name="gender">
     <option></option>
     <option class="click">Male</option>
     <option>Female</option>
     <option>Other</option>
</select>

<script>
element = document.getElementById('gender');

for (var iterator = 0; iterator < element.options.length; iterator++) {
    var optionElement = element.options[iterator];
    if (optionElement.className == 'click') {
        optionElement.addEventListener('click', function() {alert('gender')})
    }
}
</script>

我不能在&lt;select&gt; 上使用事件的原因是因为我需要知道下拉菜单是否已展开(上面的第 1 点)。我也考虑过使用onChange 事件,但浏览器似乎对它的反应不同。有些会在您单击时做出反应,有些会在您更改值时做出反应。

【问题讨论】:

  • 请注意,用户无需点击即可展开选择元素并选择选项。
  • stackoverflow.com/questions/19387634/detect-drop-down-openes 看看这个。奇怪的是,其他浏览器确实检测到选项上的点击事件。我会尝试在 chrome 上引用下拉菜单的渲染或阅读有关它的文档。 (我找不到有关 chrome 渲染的文档:()

标签: javascript html google-chrome dom drop-down-menu


【解决方案1】:

看起来我的两个选项都不可行(除非有人修复损坏的事件)。

选项 1. 我尝试在选择上实现一些“扩展跟踪器”,以了解元素何时实际展开,但由于浏览器处理选择的方式不同,这似乎是不可能完成的任务。即使找到了某种神奇的秘方,它对于任何未来的浏览器更新都是脆弱的。

选项 2. 鉴于 Firefox 对 onchange 事件也有不当行为,我不知道有任何方法可以解决此类问题,也不知道如何强制 Chrome 对似乎发生的事件做出反应忽略(也许一些 JavaScript 大师可以在这里提出一些时髦的解决方案,但我会感到惊讶)。

因此,经过多次尝试,&lt;select&gt; 的行为方式似乎存在 3 个主要差异:

  1. IE 10 及更低版本使用非常有限的下拉渲染引擎(就样式而言)。
  2. Firefox 在使用键盘时无法正确处理onchange 事件。
  3. Chrome 确实会忽略 &lt;option&gt; 事件。

鉴于这种糟糕的组合,我不得不求助于:

  1. 对 IE
  2. 添加一个onkeydown 事件来修复Firefox 的onchange 情况。
  3. 仅使用选择事件来绕过 Chrome 的限制。

在 Firefox 上渲染效果并不理想,因为存在某种延迟,但这看起来是最好的,因为它会考虑到非标准的 &lt;select&gt; 元素是多么的不标准。

我没有深入了解我想要做的事情的细节,但我实际上是在尝试在选定元素上实现“占位符样式”,以便在我的表单上具有统一的外观和感觉。有趣的部分是不同的浏览器如何处理&lt;select&gt; 样式,以及下拉展开和不展开时样式有何不同。

【讨论】:

    【解决方案2】:

    试试这个:

    element = document.getElementById('gender');
    
    element.addEventListener('change', function() {
        if (this.value === 'Male') {
            alert(this.value);
        }
    });
    

    此代码已在 OSX 上使用 Chrome、Firefox 和 Safari 进行测试。

    【讨论】:

    • 是的,您指向的是选择元素,而不是选项。我的问题是关于选项的。
    • 但它给你的正是你想要的。是否有理由说明哪种方法对您不起作用。如果您有额外的功能要执行,您仍然可以根据所选择的选项的选择来执行。
    • 就像我说的,一些浏览器对“onchange”事件的反应不同。一些在您单击时触发,另一些在您更改值后触发。由于当“选择”展开时,我需要特定的样式,并且当它不是时,这不会为我的用例工作。 span>
    猜你喜欢
    • 2022-01-05
    • 2010-11-26
    • 2021-11-10
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 2017-02-12
    相关资源
    最近更新 更多