JavaScript fireEvent 不是一个函数?

4

我正在尝试使用JavaScript制作一款战舰游戏,这是我的学校作业,但我卡在了创建对手AI上。我已经为网格中的单元格创建了一个事件:

function addListener(evt) {
    evt.addEventListener('click', function(){
        //bunch of code
    });
}

现在,在我的嵌套循环中,每次创建一个新单元格时,我都会运行这个函数addListener

yourCell.setAttribute('id', evt + String(a) + String(b));
addListener(yourCell);

现在我想要的是在我完成我的回合后,对手能够运行这个点击事件,因此我写了这个代码来测试fireEvent函数:

function enemyTurn() {
    document.getElementById('yourGrid00').fireEvent('onclick');
}

根据第二个代码示例,我将单元格的ID设置为'yourGrid00',在JavaScript代码运行后,通过检查HTML代码进行了确认,并且在每个单元格被创建并分配ID之前,函数enemyTurn()不会运行。
我不明白的是,在fireEvent行上我收到以下错误:

未捕获的TypeError:未定义的函数。

有人知道我做错了什么吗?
1个回答

4
fireEvent是一个非常老的方法,仅支持Internet Explorer 8及以下版本。如果您想处理最新的浏览器,应该使用dispatchEvent

在指定的EventTarget上分派一个Event,按适当的顺序调用受影响的EventListeners。 使用dispatchEvent()手动分派事件时,正常的事件处理规则(包括捕获和可选的冒泡阶段)适用。

但是您必须手动创建Event - 您不能只调用dispatchEvent('onclick')。 我已经从此答案中提取了以下代码的第一部分。

var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window, 1, 0, 0, 0, 0,
    false, false, false, false, 0, null);

function enemyTurn() {
    document.getElementById('yourGrid00').dispatchEvent(evt);
}

JSFiddle演示


非常感谢!这似乎起作用了 :) 我只是在谷歌搜索如何模拟点击,我偶然发现了 fireEvent,并找到了我认为它仍在使用的文档。 - Torstein Røsok
能否解释一下 initMouseEvent 的所有属性是什么意思? - Torstein Røsok
@TorsteinRøsok 这些设置了鼠标事件是什么,事件发生的位置以及其他一些细节。MDN在这里有相关文档:https://developer.mozilla.org/en-US/docs/Web/API/event.initMouseEvent。`event.initMouseEvent(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);` - James Donnelly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接