为什么我的jQuery触发的keyup事件会丢失?

时间:2013-04-08 06:42:08

标签: javascript jquery

我正在使用jQuery 1.7.1

我的keyup处理程序工作正常,即使设置有点复杂。这是在iframe叠加层中发生的。主页确实如此

our.Catalog.makeViewer = function(id) {
  var iframe = document.createElement('iframe');
  iframe.setAttribute()... // src, id, name, etc.  Exact same host and method
  document.body.appendChild(iframe);
  iframe.contentWindow.focus();
  $('html, body').css('overflow', 'hidden');
}
our.Catalog.makeViewer('foo') // actually bound to a click hander

在iframe <head>中,我们有类似

的内容
our.Viewer = function(){
   $(document).keyup(function(e){ doSomething() })
   // and lots more, of course
}
$(function() {
  new our.Viewer();
});

浏览器显示iframe的网址。我得到了整个浏览器窗口的所有真正的密钥,这很好,但是为了测试我希望能够从JavaScript模拟密钥。但是,无论我尝试什么都行不通。我试过了

$('body').trigger($.Event('keyup', {keycode: 40}))
$(document).trigger($.Event('keyup', {keycode: 40})) 
$(document).keyup()

并且没有一个触发我的处理程序。然后我想也许问题是我正在使用iframe,所以我试过

$('#frameId').contents().find('body').trigger($.Event('keyup', {keycode: 40}))

不,这也不起作用。我不认为这是任何类型的权限/安全问题,因为$('#frameId').contents().find('body').addClass('test')工作正常。

我希望我做一些有些人可以轻易纠正的蠢事。如何从JavaScript驱动程序模拟keyup?

3 个答案:

答案 0 :(得分:2)

好的,code recommended by the jQuery文档适用于Selenium。或者至少是单行版本:

$('body').trigger($.Event('keyup', {keycode: 40, which: 40}))

在我的特定情况下,我没有从Selenium看到它,因为我们的处理程序检查e.which而非e.keycodee.which仍未定义,直到我们明确设置它。也许是jQuery 1.7.1中的一个错误?也许是由于jQuery和Selenium之间的互动?无论如何,设置e.which让测试通过。

另一方面,从浏览器控制台获取工作更具挑战性。从Firefox上的Firebug我不得不cd(frames[2])将上下文设置为有问题的iframe。没有其他方式从另一个框架访问iframe会让我触发事件,可能是由于某种沙盒。 (我可以访问iframe的DOM,但不能访问iframe的jQuery。)在Chrome中,我必须从控制台底部的弹出菜单中选择iframe。在Safari中我必须使用

window.frames[2].$('body').trigger($.Event('keyup', {keycode: 40, which: 40}))

正如我所料,一些相对愚蠢的事情,没有在控制台中设置iframe上下文,并且由于其他原因实际上在Selenium中未通过测试。

谢谢@Ian的尝试。

答案 1 :(得分:-2)

试试这个

$(document).on("keyUp",function(){ 
    //your logic
});

答案 2 :(得分:-2)

.trigger()仅适用于与.on()绑定的事件。

尝试绑定:

$(document).on('keyup', function (e) {
    doSomething(e.keyCode);
}); 

测试:

$(document).trigger($.Event("keyup", { keyCode: 40 }));