【问题标题】:Firefox: unwanted click events triggered by HTML select/optionsFirefox:由 HTML 选择/选项触发的不需要的点击事件
【发布时间】:2017-06-08 07:47:15
【问题描述】:

我有一个select 元素和options 可供选择。选择option 会触发回调(在我的实际项目中,它是一个在页面上创建新元素并使用ajax 调用将内容加载到其中的函数)。我可以在 Firefox 中通过selectchange 事件处理程序或options'click 事件处理程序(请参阅下面的代码)来完成。当您只选择一个选项并单击它时,这一切都可以完美运行。

当您通过在select 外部单击离开时,问题就开始了。例如,如果您通过单击打开下拉列表,然后使用键盘上的箭头逐步浏览一些 options,然后在 select 之外单击会生成 select.change(很好)和 option.click事件(这不太好,因为没有人点击option)。我仍然可以接受(虽然那个手势意味着放弃元素而不是选择一个选项),但是当你真正点击也会触发事件的东西时(在现实生活中,例如,在页面上创建或销毁元素) ,它会产生混乱。

说到下面的示例代码,我想要实现的是,通过 一个 单击,divoption 成为 clicked,而不是两者。 (我不关心select.change。)

我已尝试捕获和解除绑定selectblurfocusout 事件,但无济于事。

当用户简单地放弃 select 时,如何防止 Firefox 触发 option.click

打开选择,使用键盘上的箭头移动,然后单击 div(“单击此 div”)在 JS 控制台上产生以下输出:

select was changed
option1 was clicked
div was clicked

我使用的是 Firefox 50.1。 jQuery 1.4.2 由我要使用的门户提供。

代码:

$('.myDiv')
    .click( function (e) {
        console.log('div was clicked');
        return false;
    })
;
$('.mySelect')
    .change( function (e) {
        console.log('select was changed');
        return false;
    })
;
$('.mySelect option')
    .click( function (e) {
        console.log($(this).val() + ' was clicked');
        return false;
    })
;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<div class='myDiv'>click on this div</div>
<select class='mySelect'>
<option disabled='disabled' selected='selected'>Please select an option</option>
<option>option1</option>
<option>option2</option>
<option>option3</option>
</select>

【问题讨论】:

  • 只需将 e.preventDefault() 添加到您的函数中
  • @Eric 因为我使用的是 jQuery,return false 应该隐含 preventDefaultsee here。但是,我也尝试过明确说明,但没有运气。显然问题不在于默认操作,而在于触发事件本身。我怀疑只有一种解决方法才能有所帮助。
  • 另一个失败的实验:option.click 事件中的offsetXoffsetY 在选择内部和外部给出相同的常量值。如果options 不能阻止事件冒泡,select.click 也会为偏移量提供相同的常量。
  • 进一步的实验表明问题不是特定于 jQuery 的。如果我去掉所有 JS 代码,Firefox 会显示完全相同的行为,并将 console.logs 放入 HTML 标记内的 onClick 属性中:&lt;div class='myDiv' onClick="console.log('div was clicked');"&gt;some other functionality&lt;/div&gt; &lt;select class='mySelect' onClick="console.log('select was clicked');"&gt; &lt;option disabled='disabled' selected='selected'&gt;Please select an option&lt;/option&gt; &lt;option onClick="console.log('option1 was clicked');"&gt;option1&lt;/option&gt; etc. &lt;/select&gt;

标签: javascript jquery html forms firefox


【解决方案1】:

在大多数版本的 IE、Safari 和 Chrome 上,OPTION 标签上的 onclick 事件将失败:reference

【讨论】:

  • 是的,我知道。我只为 Firefox 做这个。
猜你喜欢
  • 2014-03-11
  • 2013-06-28
  • 2019-03-03
  • 2018-07-23
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 2018-08-18
  • 2020-01-07
相关资源
最近更新 更多