KeyNav.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:4k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.1.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. /**
  8.  * @class Ext.KeyNav
  9.  * <p>Provides a convenient wrapper for normalized keyboard navigation.  KeyNav allows you to bind
  10.  * navigation keys to function calls that will get called when the keys are pressed, providing an easy
  11.  * way to implement custom navigation schemes for any UI component.</p>
  12.  * <p>The following are all of the possible keys that can be implemented: enter, left, right, up, down, tab, esc,
  13.  * pageUp, pageDown, del, home, end.  Usage:</p>
  14.  <pre><code>
  15. var nav = new Ext.KeyNav("my-element", {
  16.     "left" : function(e){
  17.         this.moveLeft(e.ctrlKey);
  18.     },
  19.     "right" : function(e){
  20.         this.moveRight(e.ctrlKey);
  21.     },
  22.     "enter" : function(e){
  23.         this.save();
  24.     },
  25.     scope : this
  26. });
  27. </code></pre>
  28.  * @constructor
  29.  * @param {Mixed} el The element to bind to
  30.  * @param {Object} config The config
  31.  */
  32. Ext.KeyNav = function(el, config){
  33.     this.el = Ext.get(el);
  34.     Ext.apply(this, config);
  35.     if(!this.disabled){
  36.         this.disabled = true;
  37.         this.enable();
  38.     }
  39. };
  40. Ext.KeyNav.prototype = {
  41.     /**
  42.      * @cfg {Boolean} disabled
  43.      * True to disable this KeyNav instance (defaults to false)
  44.      */
  45.     disabled : false,
  46.     /**
  47.      * @cfg {String} defaultEventAction
  48.      * The method to call on the {@link Ext.EventObject} after this KeyNav intercepts a key.  Valid values are
  49.      * {@link Ext.EventObject#stopEvent}, {@link Ext.EventObject#preventDefault} and
  50.      * {@link Ext.EventObject#stopPropagation} (defaults to 'stopEvent')
  51.      */
  52.     defaultEventAction: "stopEvent",
  53.     /**
  54.      * @cfg {Boolean} forceKeyDown
  55.      * Handle the keydown event instead of keypress (defaults to false).  KeyNav automatically does this for IE since
  56.      * IE does not propagate special keys on keypress, but setting this to true will force other browsers to also
  57.      * handle keydown instead of keypress.
  58.      */
  59.     forceKeyDown : false,
  60.     // private
  61.     relay : function(e){
  62.         var k = e.getKey();
  63.         var h = this.keyToHandler[k];
  64.         if(h && this[h]){
  65.             if(this.doRelay(e, this[h], h) !== true){
  66.                 e[this.defaultEventAction]();
  67.             }
  68.         }
  69.     },
  70.     // private
  71.     doRelay : function(e, h, hname){
  72.         return h.call(this.scope || this, e);
  73.     },
  74.     // possible handlers
  75.     enter : false,
  76.     left : false,
  77.     right : false,
  78.     up : false,
  79.     down : false,
  80.     tab : false,
  81.     esc : false,
  82.     pageUp : false,
  83.     pageDown : false,
  84.     del : false,
  85.     home : false,
  86.     end : false,
  87.     // quick lookup hash
  88.     keyToHandler : {
  89.         37 : "left",
  90.         39 : "right",
  91.         38 : "up",
  92.         40 : "down",
  93.         33 : "pageUp",
  94.         34 : "pageDown",
  95.         46 : "del",
  96.         36 : "home",
  97.         35 : "end",
  98.         13 : "enter",
  99.         27 : "esc",
  100.         9  : "tab"
  101.     },
  102.     
  103.     stopKeyUp: function(e) {
  104.         var k = e.getKey();
  105.         if (k >= 37 && k <= 40) {
  106.             // *** bugfix - safari 2.x fires 2 keyup events on cursor keys
  107.             // *** (note: this bugfix sacrifices the "keyup" event originating from keyNav elements in Safari 2)
  108.             e.stopEvent();
  109.         }
  110.     },
  111.     
  112.     /**
  113.      * Destroy this KeyNav (this is the same as calling disable).
  114.      */
  115.     destroy: function(){
  116.         this.disable();    
  117.     },
  118. /**
  119.  * Enable this KeyNav
  120.  */
  121. enable: function() {
  122.         if (this.disabled) {
  123.             if (Ext.isSafari2) {
  124.                 // call stopKeyUp() on "keyup" event
  125.                 this.el.on('keyup', this.stopKeyUp, this);
  126.             }
  127.             this.el.on(this.isKeydown()? 'keydown' : 'keypress', this.relay, this);
  128.             this.disabled = false;
  129.         }
  130.     },
  131. /**
  132.  * Disable this KeyNav
  133.  */
  134. disable: function() {
  135.         if (!this.disabled) {
  136.             if (Ext.isSafari2) {
  137.                 // remove "keyup" event handler
  138.                 this.el.un('keyup', this.stopKeyUp, this);
  139.             }
  140.             this.el.un(this.isKeydown()? 'keydown' : 'keypress', this.relay, this);
  141.             this.disabled = true;
  142.         }
  143.     },
  144.     
  145.     /**
  146.      * Convenience function for setting disabled/enabled by boolean.
  147.      * @param {Boolean} disabled
  148.      */
  149.     setDisabled : function(disabled){
  150.         this[disabled ? "disable" : "enable"]();
  151.     },
  152.     
  153.     // private
  154.     isKeydown: function(){
  155.         return this.forceKeyDown || Ext.EventManager.useKeydown;
  156.     }
  157. };