如何触发keypress
以模拟真实的用户行为?
如果我使用$('#input').trigger(jQuery.Event('keypress', {which: 65}))
我希望字母“a”出现在该输入中,但即使触发按键也不会出现任何内容。
是否可以在不直接更改输入value
?
答案 0 :(得分:4)
很抱歉,但不,这不是DOM事件的工作方式。当您使用JavaScript触发事件时,它不是受信任的事件,这意味着它不会(除了稍后提到的情况)更改DOM。
当您触发jQuery(或DOM)事件时,就像DOM告诉您的JavaScript代码在输入中按下了某个键。 通常不会改变DOM本身。
根据click and DOMActivate,触发时将执行默认行为的唯一事件是specification。来自规范:
大多数不受信任的事件不应触发默认操作,但click或DOMActivate事件除外。这些事件会触发激活触发器的默认操作(有关详细信息,请参阅激活触发器和行为);这些不受信任的事件的isTrusted属性值为false,但仍会启动任何默认操作以实现向后兼容性。
所有其他不受信任的事件必须表现得就像在该事件上调用了Event.preventDefault()方法一样。
你必须在jQuery中更改输入的value
(.val()
)。
答案 1 :(得分: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是一团糟。