UNPKG

use-on-demand

Version:
441 lines 16.8 kB
// import { xX_SArray_Helper } from '../symbol-array/SArray_Helper'; var xX_DomEvt_Helper = /** @class */ (function () { function xX_DomEvt_Helper() { } /** * 绑定事件 * @param ele dom元素 * @param eventName 事件名称 * @param fn 事件回调函数 */ xX_DomEvt_Helper.prototype.bindEvt = function (ele, eventName, fn) { if (!ele) { console.error('on(ele, eventName, fn)函数第一个参数必须是一个dom元素!'); return; } if (!eventName || typeof eventName !== 'string') { console.error('on(ele, eventName, fn)函数第二个参数必须是一个字符串!'); return; } if (!fn || typeof fn !== 'function') { console.error('on(ele, eventName, fn)函数第三个参数必须是一个函数!'); return; } if (!ele._events) { ele._events = {}; } if (!(eventName in ele._events)) { ele._events[eventName] = [fn]; // 非IE浏览器,采用这个方式绑定 // @ts-ignore if (document.addEventListener) { ele.addEventListener(eventName, function (e) { if (ele._events) { var events = ele._events[eventName]; if (events && events.length > 0) { var i = 0; var len = events.length; for (; i < len; i++) { if (events[i]) { events[i].call(ele, e); } } } } }, false); // IE浏览器,采用这个方式绑定 } else if (window.attachEvent && ele.attachEvent) { ele.attachEvent('on' + eventName, function () { if (ele._events) { var events = ele._events[eventName]; var e_1 = window.event; if (e_1) { e_1.preventDefault = function () { e_1.returnValue = false; }; e_1.stopPropagation = function () { e_1.cancelBubble = true; }; } var i = 0; var len = events.length; for (; i < len; i++) { events[i].call(ele, e_1); } } }); } } else { var index = xX_SArray_Helper.getIndex_fromRule(ele._events[eventName], function (item) { return item === fn; }); if (index < 0 || typeof index === 'undefined') { ele._events[eventName].push(fn); } } return; }; /** * 解绑事件 * @param ele dom元素 * @param eventName 事件名称 * @param fn 事件回调函数 */ xX_DomEvt_Helper.prototype.unbindEvt = function (ele, eventName, fn) { var index; if (!ele) { console.error('off(ele, eventName, fn)函数第一个参数必须是一个dom元素!'); return; } if (!eventName || typeof eventName !== 'string') { console.error('off(ele, eventName, fn)函数第二个参数必须是一个字符串!'); return; } if (!ele._events) { return; } if (!eventName) { return; } var events = ele._events[eventName]; // 如果只传递了事件名称而未传递具体的事件,则将指定事件名称的所有回调函数全部清除 if (eventName && !fn) { // @ts-ignore if (document.removeEventListener) { for (var i = 0, len = events.length; i < len; i++) { ele.removeEventListener(eventName, events[i], false); } } else if (window.detachEvent && ele.detachEvent) { for (var i = 0, len = events.length; i < len; i++) { ele.detachEvent('on' + eventName, events[i]); } } delete ele._events[eventName]; } else if (eventName && fn) { if (!events) { return; } // @ts-ignore if (document.removeEventListener) { if (events.length === 1) { ele.removeEventListener(eventName, fn, false); delete ele._events[eventName]; } else { index = xX_SArray_Helper.getIndex_fromRule(events, function (item) { return item === fn; }); if (index > -1) { events.splice(index, 1); } } } else if (window.detachEvent && ele.detachEvent) { if (!events) { return; } if (events.length === 1) { ele.detachEvent('on' + eventName, fn); delete ele._events[eventName]; } else { index = xX_SArray_Helper.getIndex_fromRule(events, function (item) { return item === fn; }); if (index > -1) { events.splice(index, 1); } } } } events = null; return; }; // // // /** * 当【Dom拖动操作】时,处理被拖动条目————【TransferItems】。 */ xX_DomEvt_Helper.prototype.onDragDom_handleDataTransferItems = function (items, callbackBundle) { for (var i = 0; i < items.length; i += 1) { var kind = items[i].kind; var type = items[i].type; // 逻辑开始 if (kind == 'string') { if (type.indexOf('text/plain') != -1) { items[i].getAsString(function (str) { // str是纯文本,该怎么处理,就在这里处理 if (callbackBundle.plainString_CB) { callbackBundle.plainString_CB(str); } }); } else if (type.indexOf('text/html') != -1) { items[i].getAsString(function (str) { // str是富文本,就在这里处理 if (callbackBundle.htmlMultiString_CB) { callbackBundle.htmlMultiString_CB(str); } }); } else if (type.indexOf('text/uri-list') != -1) { items[i].getAsString(function (str) { // str是uri地址,在这里进行处理 if (callbackBundle.uriOrLink_pathString_CB) { callbackBundle.uriOrLink_pathString_CB(str); } }); } } else if (kind == 'file') { // 如果是图片 if (type.indexOf('image/') != -1) { var file = items[i].getAsFile(); // file就是图片文件对象,可以上传,或者其他处理 if (callbackBundle.file_CB) { callbackBundle.file_CB(file); } } } } }; return xX_DomEvt_Helper; }()); export { xX_DomEvt_Helper }; // // // // // // // // var xX_BrowserEventMap = /** @class */ (function () { function xX_BrowserEventMap() { } xX_BrowserEventMap.MOUSE = { // 单次左键【完整点击】 click: 'click', // 连续两次左键【完整点击】:双击 dblclick: 'dblclick', // 单次右键【完整点击】 contextmenu: 'contextmenu', // 一次完整点击的各大组成部分:按下、移动、弹起。 mousedown: 'mousedown', mousemove: 'mousemove', mouseup: 'mouseup', // 鼠标悬浮 mouseenter: 'mouseenter', mouseover: 'mouseover', mouseout: 'mouseout', BUTTON_TYPE: { LeftButton: 0, RightButton: 2, }, }; xX_BrowserEventMap.KEYBOARD = { // TODO 键盘事件,通通用 event.keyCode 去取就好。 // 单次键盘【完整输入周期】:包括按下、长按和弹起。 keypress: 'keypress', keydown: 'keydown', keyup: 'keyup', /** * 参考资料: * 键盘按钮keyCode大全,keyCode列表对照表 - 如果声音记得 - 博客园 - https://www.cnblogs.com/jf-guo/p/5235136.html */ KeyCode_MAP: { // 左边大键盘区,数字 0: 48, 1: 49, 2: 50, 3: 51, 4: 52, 5: 53, 6: 54, 7: 55, 8: 56, 9: 57, // 左边大键盘区,字母 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, // TODO 切记,以上的【数字、字母】输入键,可以通过 keypress、keydown 键监听。 // TODO 以下的【非印刷键】,非常非常建议 通过 keydown,来进行监听!!! // 参考资料:JavaScript listener, "keypress" doesn't detect backspace? - Stack Overflow - https://stackoverflow.com/a/4843502/6264260 // 上方,功能键 F1: 112, F2: 113, F3: 114, F4: 115, F5: 116, F6: 117, F7: 118, F8: 119, F9: 120, F10: 121, F11: 122, F12: 123, // 特殊控制键 BackSpace: 8, Tab: 9, Enter: 13, Caps_Lock: 20, Control: 17, Shift: 16, Alt: 18, Left_Arrow: 37, Up_Arrow: 38, Right_Arrow: 39, Down_Arrow: 40, Insert: 45, Delete: 46, Num_Lock: 144, }, /** * 参考资料: * 浅谈JavaScript中按键事件的e.keyCode || e.which || e.charCode - 筱葭的博客 - CSDN博客 - https://blog.csdn.net/zhouziyu2011/article/details/53978293 */ getKeyCode: function (__e) { var e = (__e || window.event); // 此处,做出IE兼容。 return e.keyCode || e.which || e.charCode; }, }; xX_BrowserEventMap.ClipBoard = { copy: 'copy', paste: 'paste', cut: 'cut', }; xX_BrowserEventMap.DragDom = { fromSelf: { /** * TODO 以下的事件,针对DOM自身被拖动。 */ drag: 'drag', // 开始拖动、持续拖动、结束拖动 dragstart: 'dragstart', dragend: 'dragend', }, fromOthers: { /** * TODO 以下的事件,针对DOM自身没被拖动。 而是其他元素,被拖到了DOM之上来。 */ // 拖动中经过某一片区域 dragenter: 'dragenter', dragleave: 'dragleave', dragover: 'dragover', /** * 一些关于【drop】的坑 * 1.想要触发drop事件的话,必须 * 1.1 在dragover事件中使用event.preventDefault();阻止默认事件,才能触发drop事件 * 1.2 参考资料:HTML5拖放API Drag and Drop - Leechikit的专栏 - SegmentFault 思否 - https://segmentfault.com/a/1190000010127530 */ drop: 'drop', }, __dataTransfer__dropEffect_Enum: { move: 'move', copy: 'copy', link: 'link', none: 'none', }, __dataTransfer__effectAllowed_Enum: { none: 'none', copy: 'copy', copyLink: 'copyLink', copyMove: 'copyMove', link: 'link', linkMove: 'linkMove', move: 'move', all: 'all', uninitialized: 'uninitialized', }, }; xX_BrowserEventMap.Touch = { touchstart: 'touchstart', touchmove: 'touchmove', touchend: 'touchend', // TouchCancel,比较少用。(一般是一些触摸事件之外的事件,打断。如触点超出区域;弹出一个模态框;) touchcancel: 'touchcancel', }; xX_BrowserEventMap.Window = { abort: 'abort', afterprint: 'afterprint', beforeprint: 'beforeprint', beforeunload: 'beforeunload', blur: 'blur', canplay: 'canplay', canplaythrough: 'canplaythrough', change: 'change', click: 'click', compassneedscalibration: 'compassneedscalibration', contextmenu: 'contextmenu', dblclick: 'dblclick', devicelight: 'devicelight', devicemotion: 'devicemotion', deviceorientation: 'deviceorientation', drag: 'drag', dragend: 'dragend', dragenter: 'dragenter', dragleave: 'dragleave', dragover: 'dragover', dragstart: 'dragstart', drop: 'drop', durationchange: 'durationchange', emptied: 'emptied', ended: 'ended', error: 'error', focus: 'focus', hashchange: 'hashchange', input: 'input', invalid: 'invalid', keydown: 'keydown', keypress: 'keypress', keyup: 'keyup', load: 'load', loadeddata: 'loadeddata', loadedmetadata: 'loadedmetadata', loadstart: 'loadstart', message: 'message', mousedown: 'mousedown', mouseenter: 'mouseenter', mouseleave: 'mouseleave', mousemove: 'mousemove', mouseout: 'mouseout', mouseover: 'mouseover', mouseup: 'mouseup', mousewheel: 'mousewheel', MSGestureChange: 'MSGestureChange', MSGestureDoubleTap: 'MSGestureDoubleTap', MSGestureEnd: 'MSGestureEnd', MSGestureHold: 'MSGestureHold', MSGestureStart: 'MSGestureStart', MSGestureTap: 'MSGestureTap', MSInertiaStart: 'MSInertiaStart', MSPointerCancel: 'MSPointerCancel', MSPointerDown: 'MSPointerDown', MSPointerEnter: 'MSPointerEnter', MSPointerLeave: 'MSPointerLeave', MSPointerMove: 'MSPointerMove', MSPointerOut: 'MSPointerOut', MSPointerOver: 'MSPointerOver', MSPointerUp: 'MSPointerUp', offline: 'offline', online: 'online', orientationchange: 'orientationchange', pagehide: 'pagehide', pageshow: 'pageshow', pause: 'pause', play: 'play', playing: 'playing', popstate: 'popstate', progress: 'progress', ratechange: 'ratechange', readystatechange: 'readystatechange', reset: 'reset', resize: 'resize', scroll: 'scroll', seeked: 'seeked', seeking: 'seeking', select: 'select', stalled: 'stalled', storage: 'storage', submit: 'submit', suspend: 'suspend', timeupdate: 'timeupdate', unload: 'unload', volumechange: 'volumechange', vrdisplayactivate: 'vrdisplayactivate', vrdisplayblur: 'vrdisplayblur', vrdisplayconnect: 'vrdisplayconnect', vrdisplaydeactivate: 'vrdisplaydeactivate', vrdisplaydisconnect: 'vrdisplaydisconnect', vrdisplayfocus: 'vrdisplayfocus', vrdisplaypointerrestricted: 'vrdisplaypointerrestricted', vrdisplaypointerunrestricted: 'vrdisplaypointerunrestricted', vrdisplaypresentchange: 'vrdisplaypresentchange', waiting: 'waiting', }; return xX_BrowserEventMap; }()); export { xX_BrowserEventMap }; //# sourceMappingURL=dom-events.js.map