1

我有一个测试网页,如果我在它的输入字段中按下一个键,它会发出警报:

<!doctype html>
<html>
<head>
  <script type="text/javascript" src="jquery-1.9.1.min.js"></script>
  <script>
    $( document ).ready( function() {
      $( '#foo' ).keydown( function() { alert( "debug" ); } );
    });
  </script>
</head>
<body>
  <input id='foo' type='type'/>
</body>
</html>

我有这个 chrome 扩展,它可以修改输入文本并触发 keydown 事件:

$( document ).ready( function() {
  window.setTimeout( function() {
    $( '#foo' ).val( "foo" );
    $( '#foo' ).keydown();
  }, 2000 );
});

如果我安装扩展,2 秒后(如预期)文本被修改 - 但不显示警报,所以我可以建议keydown事件没有从扩展沙箱传递到页面 javascript 处理程序。是否可以以某种方式修改我的代码,以便扩展程序可以模拟页面上的 javascript 可以看到的 keydown?我正在通过 chrome 扩展程序自动化第三方网站,其中一个输入需要keyup检测值变化(我正在自动化的页面写得很糟糕 - 但我没有任何控制权,除了它的源代码)。

4

1 回答 1

11

您的代码不起作用,因为 jQuery 的keydown()方法实际上并没有触发“真正的”keydown 事件。相反,jQuery 在 中查找“绑定”事件处理程序jQuery.cache,并调用相应的函数。

由于您的内容脚本的jQuery对象与页面的对象不同jQuery,因此调用.keydown()不会导致任何操作。

在您的情况下,我建议在页面中注入您的代码,以便您的代码在与页面相同的上下文中运行。然后,调用$('#foo').keydown()将使用页面的 jQuery 对象,并产生预期的行为。

一个不依赖于任何库的通用解决方案是使用KeyboardEvent构造函数(在 DOM4 中定义)来触发事件:

var event = new KeyboardEvent('keydown');
document.querySelector('#foo').dispatchEvent(event);
于 2013-06-17T19:21:40.703 回答