博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vue 自定义指令心得
阅读量:5111 次
发布时间:2019-06-13

本文共 3935 字,大约阅读时间需要 13 分钟。

//各个快捷键对应的codeconst hotKeyList = {  "S": 83,  "O": 79,  "Q": 81,  "R": 82,  'ESC': 27,};function bindEvent(e, el, arg) {  if(!el || !arg){    return  }  if (el.displayFlag) {    // console.log(el) 监听组合快捷键ctrl    let keyCode = e.keyCode || e.which || e.charCode;    let ctrlKey = e.ctrlKey || e.metaKey;    if (arg === 'ESC' && keyCode === hotKeyList[arg]) {      el.click()      e.preventDefault();      e.returnValue = false;      return false;    } else {      if (ctrlKey && keyCode === hotKeyList[arg]) {        el.click()        e.preventDefault();        e.returnValue = false;        return false;      }    }  }}// 递归检测触发的按钮是否会显示function checkDisplay(el) {  if (el.localName === "body") {    return true  }  if (el.style.display === 'none') {    return false  } else {    if (el.style.display === 'block') {      return true    } else {      return checkDisplay(el.parentNode)  //递归一定要加retur    }  }}export default {  name: "shortcutKey",  inserted() {    console.log('inserted')//最好不要用bind,因为bind的el.parentNode是取不到的,用insert或是update都可以  },  update(el, binding) {    // console.log('update')    if (hotKeyList[binding.arg]) {      setTimeout(() => {        el.displayFlag = checkDisplay(el)        if (!el.displayFlag) {          window.removeEventListener('keydown', e => bindEvent(e, el, binding.arg))        } else {          window.addEventListener('keydown', e => bindEvent(e, el, binding.arg))        }      }, 300)    }  },  unbind() { //解绑事件,应该是有问题的,因为自定义指令定义的变量不是局部的,第二个指令会覆盖调之前定义的    window.removeEventListener('keydown', bindEvent)  }};
import Vue from "vue";const isServer = Vue.prototype.$isServer;const on = (function () {  if (!isServer && document.addEventListener) {    return function (element, event, handler) {      if (element && event && handler) {        element.addEventListener(event, handler, false);      }    };  }  return function (element, event, handler) {    if (element && event && handler) {      element.attachEvent("on" + event, handler);    }  };})();const nodeList = [];const ctx = "@@clickoutsideContext";let startClick;let seed = 0;!Vue.prototype.$isServer && on(document, "mousedown", e => (startClick = e));!Vue.prototype.$isServer &&  on(document, "mouseup", e => {    nodeList.forEach(node => node[ctx].documentHandler(e, startClick));  });function createDocumentHandler(el, binding, vnode) {  return function (mouseup = {}, mousedown = {}) {    if (      !vnode ||      !vnode.context ||      !mouseup.target ||      !mousedown.target ||      el.contains(mouseup.target) ||      el.contains(mousedown.target) ||      el === mouseup.target ||      (vnode.context.popperElm &&        (vnode.context.popperElm.contains(mouseup.target) ||          vnode.context.popperElm.contains(mousedown.target)))    )      return;    if (      binding.expression &&      el[ctx].methodName &&      vnode.context[el[ctx].methodName]    ) {      vnode.context[el[ctx].methodName]();    } else {      el[ctx].bindingFn && el[ctx].bindingFn();    }  };}/** * v-clickoutside * @desc 点击元素外面才会触发的事件 * @example * ```vue * 
* ``` */export default { name: "clickoutside", bind(el, binding, vnode) { nodeList.push(el); const id = seed++; el[ctx] = { id, documentHandler: createDocumentHandler(el, binding, vnode), methodName: binding.expression, bindingFn: binding.value }; }, update(el, binding, vnode) { el[ctx].documentHandler = createDocumentHandler(el, binding, vnode); el[ctx].methodName = binding.expression; el[ctx].bindingFn = binding.value; // 判断指令中是否绑定了函数 if (binding.expression) { // 如果绑定了函数 则调用那个函数,此处binding.value就是handleClose方法 binding.value(startClick); } }, unbind(el) { let len = nodeList.length; for (let i = 0; i < len; i++) { if (nodeList[i][ctx].id === el[ctx].id) { nodeList.splice(i, 1); break; } } delete el[ctx]; }};

 

转载于:https://www.cnblogs.com/xmhu/p/10115413.html

你可能感兴趣的文章
IO流的基础与小型项目
查看>>
机器学习之--KNN算法简单实现
查看>>
【转】NoSQL小故事:单服务器如何应付每秒75万次查询(2)
查看>>
[Unity Shader] 3D模型的简单属性
查看>>
壁纸推荐2018
查看>>
JQuery对象转dom ,dom转jQuery
查看>>
jquery 异步请求
查看>>
2018-09-25
查看>>
微信小程序开发---小程序对接Django---6
查看>>
[mysql] mysql批量操作时性能优化
查看>>
jQuery下拉菜单
查看>>
python习题:对比两个字典内容哪里不一样 并把不 一样的key和value打印出来
查看>>
不定长数组:vector
查看>>
pig grunt shell详解
查看>>
hadoop Shell命令详解
查看>>
jquery判断输入框的字符串是否为空或者空格
查看>>
NYOJ-44 简单DP
查看>>
java Integer与int详解 01
查看>>
OpenCV探索之路(十一):轮廓查找和多边形包围轮廓
查看>>
【Python】使用socketserver建立一个异步TCP服务器
查看>>