【问题标题】:In client-side JavaScript, is it possible to capture an event and fire it at a later stage?在客户端 JavaScript 中,是否可以捕获事件并在稍后阶段触发它?
【发布时间】:2011-04-10 03:58:15
【问题描述】:

我有兴趣做这样的事情:

...
event.preventDefault();
...
el.dispatchEvent(event);

我在 Firefox 中尝试过这个,它抛出了 NS_ERROR_ILLEGAL_VALUE 异常。

是否可以捕获一个事件并在以后触发它?


对于那些感兴趣的人,这是我的高级目标。我正在尝试确定何时在文本区域中输入下划线(即 shift +“-”)。不幸的是,Firefox 报告此事件的 keyCodecharCode 为 0,与波浪号 (shift + "`") 击键的值相同。为了消除歧义,我的想法是捕获事件,抑制其默认行为,然后在 另一个 textarea 上“释放”它。然后我会检查这个(隐藏的)文本区域的值以确定按下了哪个键。

更新:我使用的是onkeydown,而不是onkeypress

【问题讨论】:

  • 如果您还没有,请查看https://developer.mozilla.org/event...。 :)
  • (1) 捕获事件时不能只读取文本内容吗? (2) event.preventDefault(); 不会真正阻止 el.dispatchEvent(event); 执行您想要的任何操作吗?
  • 这很有趣 - String.fromCharCode(95) 返回一个下划线,而 126 是波浪号。你在哪里得到零?
  • 啊哈!显然,Firefox 在“keypress”而非“keydown”方面很有帮助(我使用的是“keydown”)。

标签: javascript dom javascript-events event-handling


【解决方案1】:

据我所知,已经在队列中的事件不能被“重用”,因为它不能被“拉出”队列。它先给你,然后给下一个处理程序,依此类推,但本机委托对所有这些都是相同的。所以,你必须做一个新的。既然你说你不能把事件的所有数据都拿出来,那就是个问题。

一个更简单的技巧可能是观察 textarea 的变化,然后在下划线出现在文本中时将其删除。如果您想保持光标位置,您可以查看here 以获取有关如何准确定位光标的解决方案(RonPK 的回复)。

出于好奇,根据我的测试here,Firefox 4 报告了正确的 charCode 和 shift 状态。这是特定版本/操作系统问题吗?

【讨论】:

  • 有用的答案。感谢您提供示例。我也在 Firefox 中看到了正确的 charCode。我更新了示例以使用"keydown" rather than "keypress",但是,我看到两者都为 0。 >.
  • 有趣!我在 ff4 中看到 keydown 和 keyup 的 keyCode 109。向下/向上键没有 charCode,因为它是在所有相关键被释放后合成的,但它们应该有一个 keyCode。更多细节在这里:quirksmode.org/js/keys.html
【解决方案2】:

有什么问题:

String.fromCharCode(event.keyCode);

?

例如在事件处理程序中:

var character = String.fromCharCode(event.keyCode);
if (character === '_') {
    // Do something.
}

【讨论】:

  • 问题是event.keyCode在这两种情况下都是0。
  • 我在发布问题时没有意识到这是相关的,但我使用的是onkeydown 而不是onkeypress
  • 我认为我没有充分的理由使用onkeydown 而不是onkeypress(当时我没有意识到其中一个可能比另一个更可靠)。我只是尝试改用onkeypress,一切似乎都正常工作。 :)
  • @davidchambers,如果你能接受我的回答,那就太好了 :) 目前我仍有反对票,这有点糟糕。
  • 尽管我发现您的回答很有帮助,但我不能接受它,因为它没有回答“是否可以捕获事件并在稍后阶段触发它?”的问题。我想撤回我的反对票,但 Stack Overflow 阻止我这样做,直到您的答案被编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
相关资源
最近更新 更多