如何使用Javascript在Safari中生成按键事件?

如何使用Javascript在Safari中生成按键事件?,javascript,safari,Javascript,Safari,如何从Safari中运行的Javascript代码以编程方式生成按键事件?看起来WebKit正在使用DOM级别3模型从Javascript创建键盘事件,而DOM级别3键盘事件模型不支持按键事件。我还有别的办法吗 我正在寻找尽可能纯的Safari/WebKit DOM解决方案。我真的不希望修改网页,也不希望添加对外部库的依赖。我需要激活任何现有的按键处理程序,因此添加一个新的处理程序并直接调用它将不起作用 看起来WebKit的UIEvent类中定义了keypress事件的keyCode和charC

如何从Safari中运行的Javascript代码以编程方式生成按键事件?看起来WebKit正在使用DOM级别3模型从Javascript创建键盘事件,而DOM级别3键盘事件模型不支持按键事件。我还有别的办法吗

我正在寻找尽可能纯的Safari/WebKit DOM解决方案。我真的不希望修改网页,也不希望添加对外部库的依赖。我需要激活任何现有的按键处理程序,因此添加一个新的处理程序并直接调用它将不起作用

看起来WebKit的UIEvent类中定义了keypress事件的keyCode和charCode属性,但它们是只读的。有没有办法设置这些属性?以下操作不起作用:

var evt = document.createEvent('UIEvents');
evt.initUIEvent('keypress', true, true, window, 0);
evt.keyCode = 114; // 'r'
evt.charCode = 114;
alert("keyCode = " + evt.keyCode + ", charCode = " + evt.charCode); // both 0
在调用initUIEvent时设置detail属性似乎也没有效果。

换句话说,您将一个按键事件附加到某个元素。使用ID为“someid”的元素,例如:

<script language="text/javascript" src="jquery.js"></script>
<script language="text/javascript">
$(function() {
    // add a keypress handler
    $("#someid").keypress(function(e){
        alert('you just pressed ' + e.which);
    });
    // imitate the keypress
    $("#someid").keypress();
});
</script>

$(函数(){
//添加一个按键处理程序
$(“#someid”)。按键(功能(e){
警报('您刚刚按下'+e.which');
});
//模仿按键
$(“#someid”).keypress();
});

听起来像是一个非常类似的(非特定于浏览器的)问题已经被提出并回答了:

使用TextEvent(由DOM3引入)。由于您希望生成按键事件,我猜您正在处理角色。在下面的代码中,textToInsert是一个字符串,textarea是我将事件分派到的元素

var eventObject = document.createEvent('TextEvent');
eventObject.initTextEvent('textInput',
                          true,
                          true,
                          null,
                          textToInsert);

textarea.dispatchEvent(eventObject);

这适用于Safari 3.1.2(因此适用于Chrome)。

我也遇到了同样的问题。我希望能够编写一个测试,当在GUI上按下enter键时,一个行项目(li)被添加到列表中。那时,我需要“生成”一个按键。在尝试生成事件、模拟事件、模拟事件(jqMock)之后,下面是一个非常简单的解决方案

我可以继续使用jsSpec和jQuery代码编辑代码。如果您使用插件来管理按键操作(例如热键jQuery插件),那么这个测试会稍微困难一些

以下是我想做的:

这是处理程序:


  __keypress: function(which){
      switch(which)
      {
        ...

        case 13:  // enter
          [my code that creates a new item]        
          break;
        default:
      }       
  },


ps:如果有人能够模拟window.event,请告诉我。我使用jqMock时运气不佳。

该示例看起来不像是在生成按键事件。在我看来,这就像是在向目标元素添加一个keypress处理函数,然后直接调用处理函数。第二部分,即:“$(“#someid”).keypress();”,正在生成按键。列出的任何解决方案对您有效吗?寻求帮助然后保释是不好的。如果答案不是您想要的,请尝试澄清。它在safari中不起作用,但在firefox中效果很好。我可以在Internet Explorer中创建按键事件,因此通常不会停止按键事件的生成。看起来Safari还支持DOM级别3的keydown、keyup和textinput事件。但我正在尝试自动化那些可能已经有按键处理程序的页面。我会尝试一下,当我有机会回到那个项目时,让你们知道它是如何为我工作的。谢谢
$().items().bind('keypress', function(event){$().__keypress(event.which)})

  __keypress: function(which){
      switch(which)
      {
        ...

        case 13:  // enter
          [my code that creates a new item]        
          break;
        default:
      }       
  },