simulator.js 8.8 KB

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