WebKitカーネルブラウザinit KeyboardEvent関数のプロトタイプ

4203 ワード

JSを学習してカスタムキーボード(KeyboardEvent)イベントを送信する過程で、一つのボタンTabを正常に送ることができ、次の要素に焦点を移すことができますが、Shift+Tabを実現したいです.逆にフォーカスを移動すると、DOM 3のブラウザの互換性に問題がかかりにくくなります.
  • は参考資料1(Javascript事件シミュレーション-Mr_BackKom-ブログパーク)の方法によって、通用しません.私のブラウザはWebkitの核心の下にあります.
  • また参考資料2(Document Object Model Events嗳Events-KeyboardEvent)を探して、DOM 3の中の KeyboardEvent.init KeyboardEvent関数の定義は以下の通りです.
  • void               initKeyboardEvent(in DOMString typeArg, 
    
                                           in boolean canBubbleArg, 
    
                                           in boolean cancelableArg, 
    
                                           in views::AbstractView viewArg, 
    
                                           in DOMString keyIdentifierArg, 
    
                                           in unsigned long keyLocationArg, 
    
                                           in DOMString modifiersList);
    資料1の経験によって、DOM 3標準を使って呼び出したが、結局失敗した.
  • しょうがないので、Webkitソースコードをダウンロードして、直接にコア実現のソースコード関数プロトタイプを探します.結果は以下の通りです.
    void KeyboardEvent::initKeyboardEvent(const AtomicString& type, bool canBubble, bool cancelable, AbstractView* view,
    
                                          const String &keyIdentifier, unsigned location,
    
                                          bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey)
    
    {
    
        if (dispatched())
    
            return;
    
    
    
        initUIEvent(type, canBubble, cancelable, view, 0);
    
    
    
        m_keyIdentifier = keyIdentifier;
    
        m_location = location;
    
        m_ctrlKey = ctrlKey;
    
        m_shiftKey = shiftKey;
    
        m_altKey = altKey;
    
        m_metaKey = metaKey;
    
        m_altGraphKey = altGraphKey;
    
    }
    このプロトタイプで再度呼び出し、ついに成功しました.(PS:ソースがいいですね.)
    シミュレーションShift+Tabコードは以下の通りです.
    var evt = document.createEvent("KeyboardEvent");
    
    evt.initKeyboardEvent("keydown", true, false, window, 'U+0009',0,false,false,true,false,false); 
    
    e.currentTarget.dispatchEvent(evt);
     By:Asion TangAT:2013年9月20日23:58:40