3

如何触发keypress,使其模拟真实的用户行为?

如果我使用$('#input').trigger(jQuery.Event('keypress', {which: 65}))我希望字母“a”出现在该输入中,但即使按键被触发,也不会出现任何内容。

是否可以在不直接更改输入的情况下显示按下的键value

演示:http: //jsfiddle.net/KrHYn/

4

2 回答 2

5

抱歉,不,这不是 DOM 事件的工作方式。当您使用 JavaScript 触发事件时,它不是受信任事件,这意味着它不会(此处稍后提到的情况除外)更改 DOM。

当您触发 jQuery(或 DOM)事件时,就像 DOM 告诉您的 JavaScript 代码在输入中按下了一个键。它通常不会改变 DOM 本身。

根据规范,触发时执行默认行为的唯一事件是clickDOMActivate。从规范:

大多数不受信任的事件不应触发默认操作,除了 click 或 DOMActivate 事件。这些事件触发激活触发器的默认操作(有关更多详细信息,请参阅激活触发器和行为);这些不受信任的事件的 isTrusted 属性值为 false,但仍会启动任何默认操作以实现向后兼容性。

所有其他不受信任的事件必须表现得好像在该事件上调用了 Event.preventDefault() 方法。

您必须更改输入的value.val()在 jQuery 中)。

于 2013-03-31T13:40:09.503 回答
2

假设浏览器分为三部分:HTML、DOM 和 JavaScript。DOM 是 HTML 和 JS 可以对话的中间人。

当 JavaScript 加载一个元素时,当使用 时document.getElementById,它会告诉 DOM:“嘿,我需要这个元素!”。如果 DOM 找到它,它将返回一个称为 DOM 元素的特殊对象中的元素。

当 HTML 发生变化时(你在一个字段中输入了一些值),它会向 DOM 发送一条消息:“嘿,value这里的我的不一样。”。因此 DOM 更新了它的 DOM 元素。

当 JavaScript 在 上添加事件侦听器时keypress,它会告诉 DOM:“嘿,无论何时keypress发送事件,请告诉我。”。

因此,当 HTML 更改时(在输入中完成按键操作),它会告诉 DOM:“嘿,那里有一个按键事件!”。由于 DOM 知道 JS 正在等待按键事件的更新,它告诉 JS:“嘿,伙计,那里触发了一个事件。”。

如果您从 JS 本身运行事件,DOM 将立即向 JS 发送回:“嘿,keypress触发了一个事件,认为您可能感兴趣。”。它不会转到 HTML 并更改它。

为什么?因为 DOM 不信任 JS。它知道 JS 是个坏孩子。这里的关键词是“信任”。正如@Benjamin 所指出的,有一些值得信赖的事件。虽然他们很少。还有“向后兼容的受信任的”。

是的,DOM 是一团糟。

于 2013-03-31T14:09:38.107 回答