simulator.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. /* eslint-disable no-fallthrough */
  2. import { keys } from "../lib/keycode";
  3. export default function ($, Inputmask) {
  4. $.caret = function (input, begin, end) {
  5. input = input.nodeName ? input : input[0];
  6. input.focus();
  7. let range;
  8. if (typeof begin === "number") {
  9. end = typeof end === "number" ? end : begin;
  10. // if (!$(input).is(":visible")) {
  11. // return;
  12. // }
  13. if (input.setSelectionRange) {
  14. input.setSelectionRange(begin, end);
  15. } else if (window.getSelection) {
  16. range = document.createRange();
  17. if (input.firstChild === undefined) {
  18. const textNode = document.createTextNode("");
  19. input.appendChild(textNode);
  20. }
  21. range.setStart(
  22. input.firstChild,
  23. begin < input.value.length ? begin : input.value.length
  24. );
  25. range.setEnd(
  26. input.firstChild,
  27. end < input.value.length ? end : input.value.length
  28. );
  29. range.collapse(true);
  30. const sel = window.getSelection();
  31. sel.removeAllRanges();
  32. sel.addRange(range);
  33. // input.focus();
  34. } else if (input.createTextRange) {
  35. range = input.createTextRange();
  36. range.collapse(true);
  37. range.moveEnd("character", end);
  38. range.moveStart("character", begin);
  39. range.select();
  40. }
  41. } else {
  42. if ("selectionStart" in input && "selectionEnd" in input) {
  43. begin = input.selectionStart;
  44. end = input.selectionEnd;
  45. } else if (window.getSelection) {
  46. range = window.getSelection().getRangeAt(0);
  47. if (
  48. range.commonAncestorContainer.parentNode === input ||
  49. range.commonAncestorContainer === input
  50. ) {
  51. begin = range.startOffset;
  52. end = range.endOffset;
  53. }
  54. } else if (document.selection && document.selection.createRange) {
  55. range = document.selection.createRange();
  56. begin = 0 - range.duplicate().moveStart("character", -100000);
  57. end = begin + range.text.length;
  58. }
  59. /* eslint-disable consistent-return */
  60. return {
  61. begin,
  62. end
  63. };
  64. /* eslint-enable consistent-return */
  65. }
  66. };
  67. $.fn = $.fn || $.prototype;
  68. $.fn.SendKey = function (key, modifier) {
  69. const elem = this.nodeName ? this : this[0],
  70. origCode = key;
  71. elem.type = "text"; // force textinput to support caret fn
  72. function trigger(elem, evnt) {
  73. elem.focus();
  74. if ($ === window.jQuery) {
  75. $(elem).trigger(evnt);
  76. } else {
  77. if (document.createEvent) {
  78. elem.dispatchEvent(evnt);
  79. } else {
  80. elem.fireEvent("on" + evnt.eventType, evnt);
  81. }
  82. }
  83. }
  84. switch (key) {
  85. case keys.Home:
  86. if (modifier == undefined) {
  87. $.caret(this, 0);
  88. break;
  89. }
  90. case keys.End:
  91. if (modifier == undefined) {
  92. $.caret(this, elem.value.length);
  93. break;
  94. }
  95. case keys.ArrowLeft:
  96. if (modifier == undefined) {
  97. var pos = $.caret(this);
  98. $.caret(this, pos.begin - 1);
  99. break;
  100. }
  101. case keys.ArrowRight:
  102. if (modifier == undefined) {
  103. var pos2 = $.caret(this);
  104. $.caret(this, pos2.end + 1);
  105. break;
  106. }
  107. default:
  108. if (
  109. (window.Inputmask &&
  110. window.Inputmask.prototype.defaults.inputEventOnly === true) ||
  111. (elem.inputmask && elem.inputmask.opts.inputEventOnly === true)
  112. ) {
  113. let input = new $.Event("input"),
  114. currentValue =
  115. elem.inputmask && elem.inputmask.__valueGet
  116. ? elem.inputmask.__valueGet.call(elem)
  117. : elem.value,
  118. caretPos = $.caret(elem),
  119. // caretOffset = 0,
  120. // console.log("initial " + currentValue);
  121. // console.log(caretPos);
  122. front = currentValue.substring(0, caretPos.begin),
  123. back = currentValue.substring(caretPos.end),
  124. newValue = currentValue;
  125. switch (key) {
  126. case keys.Backspace:
  127. if (caretPos.begin === caretPos.end) {
  128. front = front.substr(0, front.length - 1);
  129. }
  130. newValue = front + back;
  131. // console.log("backspace " + newValue);
  132. break;
  133. case keys.Delete:
  134. if (origCode !== ".") {
  135. if (caretPos.begin === caretPos.end) {
  136. back = back.slice(1);
  137. }
  138. newValue = front + back;
  139. break;
  140. }
  141. default:
  142. newValue = front + key[0] + back;
  143. // caretOffset = front.length > 0 ? 1 : 0;
  144. break;
  145. }
  146. if (elem.inputmask && elem.inputmask.__valueSet) {
  147. elem.inputmask.__valueSet.call(elem, newValue);
  148. } else {
  149. elem.value = newValue;
  150. }
  151. $.caret(elem, newValue.length - back.length);
  152. trigger(elem, input);
  153. } else {
  154. const keydown = new $.Event("keydown"),
  155. keypress = new $.Event("keypress"),
  156. keyup = new $.Event("keyup");
  157. keydown.key = key;
  158. if (modifier == keys.Control) {
  159. keydown.ctrlKey = true;
  160. }
  161. trigger(elem, keydown);
  162. if (!keydown.defaultPrevented) {
  163. keypress.key = key;
  164. if (modifier == keys.Control) {
  165. keypress.ctrlKey = true;
  166. }
  167. trigger(elem, keypress);
  168. if (!keypress.defaultPrevented) {
  169. keyup.key = key;
  170. if (modifier == keys.Control) {
  171. keyup.ctrlKey = true;
  172. }
  173. trigger(elem, keyup);
  174. }
  175. }
  176. }
  177. }
  178. };
  179. if (!("append" in $.fn)) {
  180. $.fn.append = function (child) {
  181. const input = this.nodeName ? this : this[0];
  182. input.insertAdjacentHTML("beforeend", child);
  183. };
  184. }
  185. if (!("remove" in $.fn)) {
  186. $.fn.remove = function () {
  187. let input = this.nodeName ? this : this[0];
  188. if (input !== undefined && input !== null) {
  189. input.parentElement.removeChild(input);
  190. input = undefined;
  191. }
  192. };
  193. }
  194. if (!("val" in $.fn)) {
  195. $.fn.val = function (value) {
  196. const input = this.nodeName ? this : this[0];
  197. if (value !== undefined) {
  198. if (input.inputmask) {
  199. input.inputmask._valueSet(value, true);
  200. $(input).trigger("setvalue");
  201. } else {
  202. input.value = value;
  203. }
  204. }
  205. return input.value;
  206. };
  207. }
  208. $.fn.Type = function (inputStr) {
  209. const input = this.nodeName ? this : this[0],
  210. $input = $(input);
  211. inputStr.split("").forEach(function (lmnt, ndx) {
  212. $input.SendKey(lmnt);
  213. });
  214. };
  215. $.fn.paste = function (inputStr) {
  216. const input = this.nodeName ? this : this[0],
  217. $input = $(input);
  218. if (window.clipboardData) {
  219. window.clipboardData.setData("Text", inputStr);
  220. } else {
  221. $.data($input, "clipboard", inputStr);
  222. window.clipboardData = {
  223. getData: function () {
  224. window.clipboardData = undefined;
  225. return $.data($input, "clipboard");
  226. }
  227. };
  228. }
  229. $input.trigger("paste");
  230. };
  231. $.fn.input = function (inputStr, caretBegin, caretEnd) {
  232. const input = this.nodeName ? this : this[0];
  233. input.inputmask.__valueSet.call(input, inputStr);
  234. if (caretBegin !== undefined) {
  235. $.caret(input, caretBegin, caretEnd);
  236. }
  237. $(input).trigger("input");
  238. };
  239. }