在Firefox 55.0.3(64位)中,以下JavaScript(形成对象函数的一部分):
console.log(vField.getAttribute('oninput'));
var vEvent = new Event("input");
var vCancelled = ! vField.dispatchEvent(vEvent);
if (!vCancelled) {
console.log(vEvent);
}
按预期,将以下内容输出到Firefox控制台:
h.eventfn(this,3,'smbtn');
输入{target:<输入#mnpws.string.newp.x01> ,,false,OriginalTarget:<输入#mnpws.string.newp.x01>,explicitoriginalTarget:< input#mnpws.string.newp.x01>}
问题: dispatchevent()未执行h.eventfn()函数。...除非我在语句上或之前插入调试器断点:
var vCancelled = ! vField.dispatchEvent(vEvent);
我看到的行为是:
- 使用上述调试器断点 - 执行h.eventfn()罚款。
- 在上述行之后的任何地方都有调试器断点 - 不执行H.EventFn()。
- 根本没有断点 - 不执行H.Eventfn()。
(作为旁注 - Chrome使用相同的代码执行H.EventFn(),并且两个浏览器都显示任何JavaScript错误,我可以看到)
我对这种行为完全感到困惑,并感谢任何人可能拥有的任何意见。谢谢!
在以下处理过程中发生:
...
vField.disabled = true;
...
[XHR request and response]
...
vField.disabled = false;
[followed by the statements in my question above]
我已经确定,评论列以下的线路禁用该字段:
// vField.disabled = true;
导致代码工作无需断点。
我只能假设:
- 禁用该领域会导致Firefox忽略dispatchevent(),即使在dispatchevent()之前再次启用了distatchevent() 语句执行。
- 除非在重新启用和dispatchevent()语句之前存在断点,否则再次"唤醒"。
注释
- 使用Firefox Shift-F4 JS ScratchPad禁用,重新启用,然后dispatchevent()(这不包括XHR请求/响应)。可悲的是,我无法确定这是否是因为ScratchPad提供了与调试器相同的"唤醒",或者问题是否是由XHR引起的。
如果有人有比我的胡言乱语更多的洞察力,请大喊。
注意:请参阅下面的Kaiido评论,以了解该问题的非常有效的解决方法。