eventruler.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import { HandleNativePlaceholder } from "./inputHandling";
  2. import Inputmask from "./inputmask";
  3. import { keys } from "./keycode.js";
  4. import { getBufferTemplate } from "./positioning";
  5. export { EventRuler };
  6. var EventRuler = {
  7. on: function (input, eventName, eventHandler) {
  8. const $ = input.inputmask.dependencyLib;
  9. let ev = function (e) {
  10. if (e.originalEvent) {
  11. e = e.originalEvent || e; // get original event from jquery evenbt
  12. arguments[0] = e;
  13. }
  14. // console.log(e.type);
  15. let that = this,
  16. args,
  17. inputmask = that.inputmask,
  18. opts = inputmask ? inputmask.opts : undefined;
  19. if (inputmask === undefined && this.nodeName !== "FORM") {
  20. // happens when cloning an object with jquery.clone
  21. const imOpts = $.data(that, "_inputmask_opts");
  22. $(that).off(); // unbind all events
  23. if (imOpts) {
  24. new Inputmask(imOpts).mask(that);
  25. }
  26. } else if (
  27. !["submit", "reset", "setvalue"].includes(e.type) &&
  28. this.nodeName !== "FORM" &&
  29. (that.disabled ||
  30. (that.readOnly &&
  31. !(
  32. (e.type === "keydown" && e.ctrlKey && e.key === keys.c) ||
  33. (opts.tabThrough === false && e.key === keys.Tab)
  34. )))
  35. ) {
  36. e.preventDefault();
  37. } else {
  38. switch (e.type) {
  39. case "input":
  40. if (inputmask.skipInputEvent === true) {
  41. inputmask.skipInputEvent = false;
  42. return e.preventDefault();
  43. }
  44. // if (mobile) { //this causes problem see #2220
  45. // args = arguments;
  46. // setTimeout(function () { //needed for caret selection when entering a char on Android 8 - #1818
  47. // eventHandler.apply(that, args);
  48. // caret(that, that.inputmask.caretPos, undefined, true);
  49. // }, 0);
  50. // return false;
  51. // }
  52. break;
  53. case "click":
  54. case "focus":
  55. if (inputmask.validationEvent) {
  56. // #841
  57. inputmask.validationEvent = false;
  58. input.blur();
  59. HandleNativePlaceholder(
  60. input,
  61. (inputmask.isRTL
  62. ? getBufferTemplate.call(inputmask).slice().reverse()
  63. : getBufferTemplate.call(inputmask)
  64. ).join("")
  65. );
  66. setTimeout(function () {
  67. input.focus();
  68. }, opts.validationEventTimeOut);
  69. return false;
  70. }
  71. args = arguments;
  72. setTimeout(function () {
  73. // needed for Chrome ~ initial selection clears after the clickevent
  74. if (!input.inputmask) {
  75. // `inputmask.remove()` was called before this callback
  76. return;
  77. }
  78. eventHandler.apply(that, args);
  79. }, 0);
  80. return /* false */; // #2423
  81. }
  82. const returnVal = eventHandler.apply(that, arguments);
  83. if (returnVal === false) {
  84. e.preventDefault();
  85. e.stopPropagation();
  86. }
  87. return returnVal;
  88. }
  89. };
  90. if (["submit", "reset"].includes(eventName)) {
  91. ev = ev.bind(input); // bind creates a new eventhandler (wrap)
  92. if (input.form !== null) $(input.form).on(eventName, ev);
  93. } else {
  94. $(input).on(eventName, ev);
  95. }
  96. // keep instance of the event
  97. input.inputmask.events[eventName] = input.inputmask.events[eventName] || [];
  98. input.inputmask.events[eventName].push(ev);
  99. },
  100. off: function (input, event) {
  101. if (input.inputmask && input.inputmask.events) {
  102. const $ = input.inputmask.dependencyLib;
  103. let events = input.inputmask.events;
  104. if (event) {
  105. events = [];
  106. events[event] = input.inputmask.events[event];
  107. }
  108. for (const eventName in events) {
  109. const evArr = events[eventName];
  110. while (evArr.length > 0) {
  111. const ev = evArr.pop();
  112. if (["submit", "reset"].includes(eventName)) {
  113. if (input.form !== null) $(input.form).off(eventName, ev);
  114. } else {
  115. $(input).off(eventName, ev);
  116. }
  117. }
  118. delete input.inputmask.events[eventName];
  119. }
  120. }
  121. }
  122. };