1. Vue.directive('longpress', {
    2. bind: function(el, binding, vNode) {
    3. // 确保提供的表达式是函数
    4. if (typeof binding.value !== 'function') {
    5. // 获取组件名称
    6. const compName = vNode.context.name;
    7. // 将警告传递给控制台
    8. let warn = `[longpress:] provided expression '${binding.expression}' is not a function, but has to be `;
    9. if (compName) { warn += `Found in component '${compName}' `}
    10. console.warn(warn);
    11. }
    12. // 定义变量
    13. let pressTimer = null;
    14. // 定义函数处理程序
    15. // 创建计时器( 1秒后执行函数 )
    16. let start = (e) => {
    17. if (e.type === 'click' && e.button !== 0) {
    18. return;
    19. }
    20. if (pressTimer === null) {
    21. pressTimer = setTimeout(() => {
    22. // 执行函数
    23. handler();
    24. }, 1000)
    25. }
    26. }
    27. // 取消计时器
    28. let cancel = (e) => {
    29. // 检查计时器是否有值
    30. if ( pressTimer !== null ) {
    31. clearTimeout(pressTimer);
    32. pressTimer = null;
    33. }
    34. }
    35. // 运行函数
    36. const handler = (e) => {
    37. // 执行传递给指令的方法
    38. binding.value(e)
    39. }
    40. // 添加事件监听器
    41. el.addEventListener("mousedown", start);
    42. el.addEventListener("touchstart", start);
    43. // 取消计时器
    44. el.addEventListener("click", cancel);
    45. el.addEventListener("mouseout", cancel);
    46. el.addEventListener("touchend", cancel);
    47. el.addEventListener("touchcancel", cancel);
    48. }
    49. })