2011-03-01 3 views
2

키 입력 및 키 입력 조합을 처리하는 Javascript 클래스를 작성하고 있습니다. 예를 들어, 다음은 SHIFT 키에 대한 콜백을 추가합니다. 이것은 지금까지 파이어 폭스에서 잘 작동하고키보드 ALT 한정자를 재정의 할 수 없습니다.

MYAPP.Keyboard.instance().observe(
    MYAPP.Keyboard.type.KEYUP, 
    [MYAPP.Keyboard.key.F, MYAPP.Keyboard.key.SHIFT], 
    function() { 
     MYAPP.Broadcast.instance().signal('file'); 
    } 
); 

,하지만 난 수정으로 ALT를 사용하려고하지 않을 때 :

MYAPP.Keyboard.instance().observe(
    MYAPP.Keyboard.type.KEYDOWN, 
    MYAPP.Keyboard.key.SHIFT, 
    function() { 
     $$('body').first().addClassName('keyboardHintShow'); 
    } 
); 

SHIFT + F에 대한 예는 것입니다. 두 가지 문제가 발생합니다. 1) 이벤트 전파가 멈추지 않아 Firefox의 파일 메뉴가 나타납니다. 2) ALT 및 FF의 onKeyUp에 발광되므로 ALT의 상태를 해제 한 후 잘못이다. 무엇이 ALT과 다른 점은 SHIFT입니까?

MYAPP.Keyboard = Class.create({ 

/******************************************************************************* 
PUBLIC PUBLIC PUBLIC PUBLIC PUBLIC PUBLIC PUBLIC PUBLIC PUBLIC PUBLIC PUBLIC PUB 
*******************************************************************************/ 

    /** 
    * @return pointer 
    */ 
    initialize: function() { 
     this.downKeys = new Hash(); 
     this.observers = new Hash(); 

     document.observe(
      'keydown', 
      this.onKeyDown.bind(this) 
     ); 

     document.observe(
      'keyup', 
      this.onKeyUp.bind(this) 
     ); 
    }, 

    /** 
    * @param MYAPP.Keyboard.type type 
    * @param MYAPP.Keyboard.key | array of MYAPP.Keyboard.key keys 
    * @param void function() callback 
    * @return void 
    */ 
    observe: function(type, keys, callback) { 
     var main; 
     var modifiers; 

     if (typeof(keys) === 'number') { 
      main = keys; 
      modifiers = []; 
     } else { 
      main = keys.first(); 
      modifiers = keys.slice(1); 
     } 

     if (this.observers.get(type) === undefined) { 
      this.observers.set(type, new Hash()); 
     } 

     this.observers.get(type).set(
      main, { 
       modifiers: modifiers, 
       callback: callback 
      } 
     ); 
    }, 

    /** 
    * @param MYAPP.Keyboard.type type 
    * @param MYAPP.Keyboard.key 
    * @return void 
    */ 
    stopObserving: function(type, key) { 
     this.observers.get(type).unset(key); 
    }, 

/******************************************************************************* 
PRIVATE PRIVATE PRIVATE PRIVATE PRIVATE PRIVATE PRIVATE PRIVATE PRIVATE PRIVATE 
*******************************************************************************/ 

    /** 
    * @param Event event 
    * @return void 
    */ 
    onKeyDown: function(event) { 
     if (this.downKeys.get(event.keyCode) === true) { 
      return; 
     } 

     this.downKeys.set(event.keyCode, true); 

     var downObservers = this.observers.get(MYAPP.Keyboard.type.KEYDOWN); 
     if (downObservers !== undefined) { 
      this.runCallback(downObservers, event); 
     } 
     return false; 
    }, 

    /** 
    * @param Event event 
    * @return void 
    */ 
    onKeyUp: function(event) { 
     this.downKeys.set(event.keyCode, false); 

     var downObservers = this.observers.get(MYAPP.Keyboard.type.KEYUP); 
     if (downObservers !== undefined) { 
      this.runCallback(downObservers, event); 
     } 
     return false; 
    }, 

    /** 
    * @param Hash observers 
    * @param Event event 
    * @return void 
    */ 
    runCallback: function(observers, event) { 
     var overrideBrowser = false; 
     var order = observers.get(event.keyCode); 
     if (order !== undefined) { 
      if (order.modifiers.size() === 0) { 
       order.callback(); 
       Event.stop(event); 
      } else { 
       for (var i = 0; i < order.modifiers.size(); i++) { 
        var modifierStatus = this.downKeys.get(order.modifiers[i]); 
        if (modifierStatus === undefined || modifierStatus === false) { 
         return; 
        } 
        order.callback(); 
        Event.stop(event); 
       } 
      } 
     } 
    } 
}); 

/******************************************************************************* 
STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STA 
*******************************************************************************/ 

/** 
* @return Keyboard instance 
*/ 
MYAPP.Keyboard.instance = function() { 
    if (typeof(MYAPP.keyboard) === 'undefined') { 
     MYAPP.keyboard = new MYAPP.Keyboard(); 
    } 
    return MYAPP.keyboard; 
}; 

/** 
* Event type 
*/ 
MYAPP.Keyboard.type = { 
    KEYUP: 0, 
    KEYDOWN: 1 
}; 

/** 
* Keycodes for various keys. 
*/ 
MYAPP.Keyboard.key = { 
    SHIFT: 16, 
    CTRL: 17, 
    ALT: 18, 
    A: 65, 
    B: 66, 
    C: 67, 
    D: 68, 
    E: 69, 
    F: 70, 
    G: 71, 
    H: 72, 
    I: 73, 
    J: 74, 
    K: 75, 
    L: 76, 
    M: 77, 
    N: 78, 
    O: 79, 
    P: 80, 
    Q: 81, 
    R: 82, 
    S: 83, 
    T: 84, 
    U: 85, 
    V: 86, 
    W: 87, 
    X: 88, 
    Y: 89, 
    Z: 90 
}; 

답변

1

This는 예로서 도움이 될 수

여기에 전체 코드입니다. 페이지 하단의 저자는 자신의 스크립트가 Ctrl, Alt, Shift, Meta와 같은 모든 수정자를 덮어 씁니다. 어떻게 든이 도움을 바래.

관련 문제