代码之家  ›  专栏  ›  技术社区  ›  Greg

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

  •  5
  • Greg  · 技术社区  · 16 年前

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

    看起来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属性似乎也没有效果。

    4 回复  |  直到 16 年前
        1
  •  7
  •   Rahul Pratap Rahul Pratap    15 年前

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

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

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

        2
  •  0
  •   Community Paul Sweatte    7 年前

    听起来像是一个非常相似的(非特定浏览器)问题已经被问到和回答了:

    Trigger a keypress with jQuery...and specify which key was pressed

        3
  •  0
  •   todd    15 年前

    我可以继续使用jsSpec和jQuery代码对代码进行bding。如果您使用一个插件来管理按键操作(例如热键jQuery插件),那么这个测试会有点困难

    我想做的是:

    describe 'I need to be able to edit items in a list', {
    
    

    ... [setup code and other tests]

    'should create a new item if I press enter': function(){ value_of($('#todo').items().size()).should_be(7) // be on the last item in the list task = $('#todo').items().filter(':last').focus() // press enter task.__keypress(13) // check that an item was added value_of($('#todo').tasks().size()).should_be(8) }, }

    下面是绑定处理程序的代码。注意,在这个解决方案中,我截获事件并只通过 which

    $().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:
          }       
      },
    
    

    附言:如果有人能嘲笑window.event事件让我知道。我使用jqMock时运气不好。

        4
  •  -2
  •   Matt    16 年前

    http://docs.jquery.com/Events/keypress#fn

    换句话说,您可以将一个keypress事件附加到某个元素。使用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>