javascript - 在禁用的 HTMLElement 上触发事件

标签 javascript html

我有一个我不想在其上触发事件的文本区域元素。 当设置一个监听器并且元素被禁用时,我得到了一个不一致的行为。 Chrome (64.0.3282.186)、Safari (11.0.3) 和 Edge 触发事件,一切看起来都很好(正如我期望的那样),但在 Firefox (58.0.2) 中,事件监听器不会触发。 有人知道如何在不启用元素的情况下解决这个问题吗?

var eventName = 'bar',
    element = document.querySelector('#foo'),
    event = new CustomEvent(eventName, {
        cancelable: true,
        bubbles: false,
        detail: null
    });

element.addEventListener(eventName, function() {
    element.value = 'X';
});
element.dispatchEvent(event);
<textarea id="foo" disabled="disabled"></textarea>

最佳答案

添加一个 HTMLElement 方法来启用元素、调度事件然后再次禁用它。

HTMLElement.prototype.fireEvent = function(e) {
    const isDisabled = this.hasAttribute('disabled');
    
    this.removeAttribute('disabled');
    this.dispatchEvent(e);
  
    if (isDisabled)
        this.setAttribute('disabled', true);
};

var eventName = 'bar',
    element = document.querySelector('#foo'),
    event = new CustomEvent(eventName, {
        cancelable: true,
        bubbles: false,
        detail: null
    });

element.addEventListener(eventName, function() {
    element.value = 'X';
});

element.fireEvent(event)
<textarea id="foo" disabled="disabled"></textarea>

当然,这会修改不受欢迎的原生元素 - 您可以避免使用原型(prototype)方法,而只需编写一个普通的旧函数,即 fireEvent(elem, event)

关于javascript - 在禁用的 HTMLElement 上触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49065256/

相关文章:

javascript - 需要帮助将我的代码压缩为函数中的 JavaScript 代码

javascript - jQuery 克隆表行

javascript - 在数据表中呈现嵌套行的最佳方法是什么?

javascript - Bootstrap 导航栏下拉菜单中的 Accordion

html - IE8 中的复选框响应缓慢

javascript - 用js将每一行的数字求和

jquery - 在下拉菜单中单击时升起选中的单选按钮

html - 制作一个与文本区域和标签对齐的值列表

javascript - 卡住鼠标悬停淡入淡出

html - 有条件地针对 Outlook 2007/2010/2013,但不是 Outlook.com