Firefox 55.0.3(64位)-JavaScript Element.disPatchEvent()除非在调试器



在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);

我看到的行为是:

  1. 使用上述调试器断点 - 执行h.eventfn()罚款。
  2. 在上述行之后的任何地方都有调试器断点 - 不执行H.EventFn()。
  3. 根本没有断点 - 不执行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评论,以了解该问题的非常有效的解决方法。

最新更新