JAVASCRIPT   9

event.js

Guest on 25th July 2021 04:15:04 PM

  1.  
  2. var _useCapture = false;
  3.  
  4. /**
  5. DOM_VK_BACK_SPACE : 8
  6. DOM_VK_TAB : 9
  7. DOM_VK_RETURN : 13
  8. DOM_VK_SPACE : 32
  9. DOM_VK_PAGE_UP : 33
  10. DOM_VK_PAGE_DOWN : 34
  11. DOM_VK_END : 35
  12. DOM_VK_HOME : 36
  13. DOM_VK_LEFT : 37
  14. DOM_VK_UP : 38
  15. DOM_VK_RIGHT : 39
  16. DOM_VK_DOWN : 40
  17. DOM_VK_DELETE : 46
  18. DOM_VK_0 ~ DOM_VK_9 : 48 ~ 57
  19. DOM_VK_SEMICOLON : 59 (;:)
  20. DOM_VK_EQUALS : 61 (=+) (+)
  21. DOM_VK_A ~ DOM_VK_Z : 65 ~ 90
  22. DOM_VK_MULTIPLY : 106 (*)
  23. DOM_VK_SUBTRACT : 109 (-_) (-)
  24. DOM_VK_DECIMAL : 110 (.)
  25. DOM_VK_DIVIDE : 111 (/)
  26. DOM_VK_COMMA : 188 (,<)
  27. DOM_VK_PERIOD : 190 (.>)
  28. DOM_VK_SLASH : 191 (/?)
  29. DOM_VK_BACK_QUOTE : 192 (`~)
  30. DOM_VK_OPEN_BRACKET : 219 ([{)
  31. DOM_VK_BACK_SLASH : 220 (\|)
  32. DOM_VK_CLOSE_BRACKET : 221 (]})
  33. DOM_VK_QUOTE : 222 ('")
  34. */
  35. // 输入文字的键值
  36. 字的键值
  37. var _INPUT_KEY_MAP = _toMap('8,9,13,32,46,48..57,59,61,65..90,106,109..// ç§»åŠ¨å…‰æ ‡çš„é”®å€¼
  38. ');
  39. // ç§»åŠ¨å…‰æ ‡çš„é// è¾“å…¥æ–‡å­—æˆ–ç§»åŠ¨å…‰æ ‡çš„é”®å€¼
  40. Map('33..40');
  41. // è¾“å…¥æ–‡å­—æˆ–ç§»åŠ¨å…‰æ ‡çš„é”®å€¼
  42. var _CHANGE_KEY_MAP = {};
  43. _each(_INPUT_KEY_MAP, function(key, val) {
  44.         _CHANGE_KEY_// add native event
  45. _each(_CURSORMOVE_KEY_MAP, function(key, val) {
  46.         _CHANGE_KEY_MAP[key] = val;
  47. });
  48.  
  49. // add native event
  50. function _bindEvent(el, type, fn) {
  51.         if (el.addEventListener){
  52.                 el.addEvent// remove native event
  53. Capture);
  54.         } else if (el.attachEvent){
  55.                 el.attachEvent('on' + type, fn);
  56.         }
  57. }
  58. // remove native event
  59. function _unbindEvent(el, type, fn) {
  60.         if (el.removeEventListener){
  61.                 el.removeEventListener(type, fn, _useCapture);
  62.         } else if (el.detachEvent){
  63.                 el.detachEvent('on' + type, fn);
  64.         }
  65. }
  66.  
  67. var _EVENT_PROPS = ('altKey,attrChange,attrName,bubbles,button,cancelable,charCode,clientX,clientY,ctrlKey,currentTarget,' +
  68.         'data,detail,eventPhase,fromElement,handler,keyCode,metaKey,newValue,offsetX,offsetY,originalTarget,pageX,' +
  69.         'pageY,prevValue,relatedNode,re// create KEvent class
  70. eenY,shiftKey,srcElement,target,toElement,view,wheelDelta,which').split(',');
  71.  
  72. // create KEvent class
  73. function KEvent(el, event) {
  74.         this.init(el, event);
  75. }
  76. _extend(KEvent, {
  77.         init : function(el, event) {
  78.                 var self = this, doc = el.ownerDocument || el.document || el;
  79.                 self.event = event;
  80.                 _each(_EVENT_PROPS, function(key, val) {
  81.                         self[val] = event[val];
  82.                 });
  83.                 if (!self.target) {
  84.                         self.target = self.srcElement || doc;
  85.                 }
  86.                 if (self.target.nodeType === 3) {
  87.                         self.target = self.target.parentNode;
  88.                 }
  89.                 if (!self.relatedTarget && self.fromElement) {
  90.                         self.relatedTarget = self.fromElement === self.target ? self.toElement : self.fromElement;
  91.                 }
  92.                 if (self.pageX == null && self.clientX != null) {
  93.                         var d = doc.documentElement, body = doc.body;
  94.                         self.pageX = self.clientX + (d && d.scrollLeft || body && body.scrollLeft || 0) - (d && d.clientLeft || body && body.clientLeft || 0);
  95.                         self.pageY = self.clientY + (d && d.scrollTop  || body && body.scrollTop  || 0) - (d && d.clientTop  || body && body.clientTop  || 0);
  96.                 }
  97.                 if (!self.which && ((self.charCode || self.charCode === 0) ? self.charCode : self.keyCode)) {
  98.                         self.which = self.charCode || self.keyCode;
  99.                 }
  100.                 if (!self.metaKey && self.ctrlKey) {
  101.                         self.metaKey = self.ctrlKey;
  102.                 }
  103.                 if (!self.which && self.button !== undefine/**
  104.                         DOM_VK_SEMICOLON : 59 (;:)
  105.                                 - IE,WEBKIT: 186
  106.                                 - GECKO,OPERA : 59
  107.                         DOM_VK_EQUALS : 61 (=+)
  108.                                 - IE,WEBKIT : 187
  109.                                 - GECKO : 107
  110.                                 - OPERA : 61
  111.                         DOM_VK_NUMPAD0 ~ DOM_VK_NUMPAD9 : 96 ~ 105
  112.                                 - IE、WEBKIT,GECKO : 96 ~ 105
  113.                                 - OPERA : 48 ~ 57
  114.                         DOM_VK_MULTIPLY : 106 (*)
  115.                                 - IE、WEBKIT,GECKO : 106
  116.                                 - OPERA : 42
  117.                         DOM_VK_ADD : 107 (+)
  118.                                 - IE、WEBKIT,GECKO : 107
  119.                                 - OPERA : 43
  120.                         DOM_VK_SUBTRACT : 109 (-_) (-)
  121.                                 - IE,WEBKIT : 189, 109
  122.                                 - GECKO : 109, 109
  123.                                 - OPERA : 109, 45
  124.                         DOM_VK_DECIMAL : 110 (.)
  125.                                 - IE、WEBKIT,GECKO : 110
  126.                                 - OPERA : 78
  127.                         DOM_VK_DIVIDE : 111 (/)
  128.                                 - IE、WEBKIT,GECKO : 111
  129.                                 - OPERA : 47
  130.  
  131.                         Reference:
  132.                         https://developer.mozilla.org/en/DOM/Event/UIEvent/KeyEvent
  133.                         http://msdn.microsoft.com/en-us/library/ms536940(v=VS.85).aspx
  134.                 */developer.mozilla.org/en/DOM/Event/UIEvent/KeyEvent
  135.                         http://msdn.microsoft.com/en-us/library/ms536940(v=VS.85).aspx
  136.                 */
  137.                 switch (self.which) {
  138.                 case 186 :
  139.                         self.which = 59;
  140.                         break;
  141.                 case 187 :
  142.                 case 107 :
  143.                 case 43 :
  144.                         self.which = 61;
  145.                         break;
  146.                 case 189 :
  147.                 case 45 :
  148.                         self.which = 109;
  149.                         break;
  150.                 case 42 :
  151.                         self.which = 106;
  152.                         break;
  153.                 case 47 :
  154.                         self.which = 111;
  155.                         break;
  156.                 case 78 :
  157.                         self.which = 110;
  158.                         break;
  159.                 }
  160.                 if (self.which >= 96 && self.which <= 105) {
  161.                         self.which -= 48;
  162.                 }
  163.         },
  164.         preventDefault : function() {
  165.                 var ev = this.event;
  166.                 if (ev.preventDefault) {
  167.                         ev.preventDefault();
  168.                 } else {
  169.                         ev.returnValue = false;
  170.                 }
  171.         },
  172.         stopPropagation : function() {
  173.                 var ev = this.event;
  174.                 if (ev.stopPropagation) {
  175.                         ev.stopPropagation();
  176.                 } else {
  177.                         ev.cancelBubble = true;
  178.                 }
  179.         },
  180.         stop : function() {
  181.                 this.preventDefault();
  182.                 this.stopPropagation();
  183.         }
  184. });
  185.  
  186. var _eventExpendo = 'kindeditor_' + _TIME, _eventId = 0, _eventData = {};
  187.  
  188. function _getId(el) {
  189.         return el[_eventExpendo] || null;
  190. }
  191.  
  192. function _setId(el) {
  193.         el[_eventExpendo] = ++_eventId;
  194.         return _eventId;
  195. }
  196.  
  197. function _removeId(el) {
  198.         try {
  199.                 delete el[_eventExpendo];
  200.         } catch(e) {
  201.                 if (el.removeAttribute) {
  202.                         el.removeAttribute(_eventExpendo);
  203.                 }
  204.         }
  205. }
  206.  
  207. function _bind(el, type, fn) {
  208.         if (type.indexOf(',') >= 0) {
  209.                 _each(type.split(','), function() {
  210.                         _bind(el, this, fn);
  211.                 });
  212.                 return;
  213.         }
  214.         var id = _getId(el);
  215.         if (!id) {
  216.                 id = _setId(el);
  217.         }
  218.         if (_eventData[id] === undefined) {
  219.                 _eventData[id] = {};
  220.         }
  221.         var events = _eventData[id][type];
  222.         if (events && events.length > 0) {
  223.                 _unbindEvent(el, type, events[0]);
  224.         } else {
  225.                 _eventData[id][type] = [];
  226.                 _eventData[id].el = el;
  227.         }
  228.         events = _eventData[id][type];
  229.         if (events.length === 0) {
  230.                 events[0] = function(e) {
  231.                         var kevent = e ? new KEvent(el, e) : undefined;
  232.                         _each(events, function(i, event) {
  233.                                 if (i > 0 && event) {
  234.                                         event.call(el, kevent);
  235.                                 }
  236.                         });
  237.                 };
  238.         }
  239.         if (_inArray(fn, events) < 0) {
  240.                 events.push(fn);
  241.         }
  242.         _bindEvent(el, type, events[0]);
  243. }
  244.  
  245. function _unbind(el, type, fn) {
  246.         if (type && type.indexOf(',') >= 0) {
  247.                 _each(type.split(','), function() {
  248.                         _unbind(el, this, fn);
  249.                 });
  250.                 return;
  251.         }
  252.         var id = _getId(el);
  253.         if (!id) {
  254.                 return;
  255.         }
  256.         if (type === undefined) {
  257.                 if (id in _eventData) {
  258.                         _each(_eventData[id], function(key, events) {
  259.                                 if (key != 'el' && events.length > 0) {
  260.                                         _unbindEvent(el, key, events[0]);
  261.                                 }
  262.                         });
  263.                         delete _eventData[id];
  264.                         _removeId(el);
  265.                 }
  266.                 return;
  267.         }
  268.         if (!_eventData[id]) {
  269.                 return;
  270.         }
  271.         var events = _eventData[id][type];
  272.         if (events && events.length > 0) {
  273.                 if (fn === undefined) {
  274.                         _unbindEvent(el, type, events[0]);
  275.                         delete _eventData[id][type];
  276.                 } else {
  277.                         _each(events, function(i, event) {
  278.                                 if (i > 0 && event === fn) {
  279.                                         events.splice(i, 1);
  280.                                 }
  281.                         });
  282.                         if (events.length == 1) {
  283.                                 _unbindEvent(el, type, events[0]);
  284.                                 delete _eventData[id][type];
  285.                         }
  286.                 }
  287.                 var count = 0;
  288.                 _each(_eventData[id], function() {
  289.                         count++;
  290.                 });
  291.                 if (count < 2) {
  292.                         delete _eventData[id];
  293.                         _removeId(el);
  294.                 }
  295.         }
  296. }
  297.  
  298. function _fire(el, type) {
  299.         if (type.indexOf(',') >= 0) {
  300.                 _each(type.split(','), function() {
  301.                         _fire(el, this);
  302.                 });
  303.                 return;
  304.         }
  305.         var id = _getId(el);
  306.         if (!id) {
  307.                 return;
  308.         }
  309.         var events = _eventData[id][type];
  310.         if (_eventData[id] && events && events.length > 0) {
  311.                 events[0]();
  312.         }
  313. }
  314.  
  315. function _ctrl(el, key, fn) {
  316.         var self = this;
  317.         key = ch == key .test(key) ? key : key.toUpperCase().charCodeAt(0);
  318.         _bind(el, 'keydown', function(e) {
  319.                 if (e.ctrlKey && e.which == key && !e.shiftKey && !e.altKey) {
  320.                         fn.call(el);
  321.                         e.stop();
  322.                 }
  323.         });
  324. }
  325.  
  326. var _readyFinished = false;
  327.  
  328. function _ready(fn) {
  329.         if (_readyFinished) {
  330.                 fn(KindEditor);
  331.                 return;
  332.         }
  333.         var loaded = false;
  334.         function readyFunc() {
  335.                 if (!loaded) {
  336.                         loaded = true;
  337.                         fn(KindEditor);
  338.                         _readyFinished = true;
  339.                 }
  340.         }
  341.         function ieReadyFunc() {
  342.                 if (!loaded) {
  343.                         try {
  344.                                 document.documentElement.doScroll('left');
  345.                         } catch(e) {
  346.                                 setTimeout(ieReadyFunc, 100);
  347.                                 return;
  348.                         }
  349.                         readyFunc();
  350.                 }
  351.         }
  352.         function ieReadyStateFunc() {
  353.                 if (document.readyState === 'complete') {
  354.                         readyFunc();
  355.                 }
  356.         }
  357.         if (document.addEventListener) {
  358.                 _bind(document, 'DOMC// 在跨域的frame里调用会报错
  359. document.attachEvent) {
  360.                 _bind(document, 'readystatechange', ieReadyStateFunc);
  361.                 // 在跨域的frame里调用会报错
  362.                 var toplevel = false;
  363.                 try {
  364.                         toplevel = window/**
  365.         Note:
  366.         发现绑定dbclick事件后移除elementä¼šæœ‰å†…å­˜æ³„æ¼ï¼Œä»¥ä¸‹ä»£ç ä¹Ÿä¸èµ·ä½œç”¨ã€‚
  367.         Reference:
  368.         http://isaacschlueter.com/2006/10/msie-memory-leaks/
  369.         http://msdn.microsoft.com/en-us/library/bb250448.aspx
  370. */™¤elementä¼šæœ‰å†…å­˜æ³„æ¼ï¼Œä»¥ä¸‹ä»£ç ä¹Ÿä¸èµ·ä½œç”¨ã€‚
  371.         Reference:
  372.         http://isaacschlueter.com/2006/10/msie-memory-leaks/
  373.         http://msdn.microsoft.

Raw Paste


Login or Register to edit or fork this paste. It's free.