選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 

428 行
15 KiB

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  6. <!-- Bootstrap CSS -->
  7. <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
  8. <script src="onscan.js"></script>
  9. <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
  10. </head>
  11. <body>
  12. <nav class="navbar navbar-dark bg-dark" style="margin-bottom: 20px">
  13. <span class="navbar-brand mb-0 h1">onScan.js Playground</span>
  14. </nav>
  15. <div class="container">
  16. <form id="playground" class="form-horizontal">
  17. <div class="row">
  18. <div class="col-12 col-xs-12">
  19. <textarea style="margin: 5px 5px 0 5px" id="consoleTextField" readonly="readonly" class="form-control" rows="10"></textarea>
  20. </div>
  21. </div>
  22. <div class="row">
  23. <div class="col-12 col-xs-12">
  24. <input style="margin: 5px 5px 0 5px" type="button" id="clearTextArea" class="btn btn-light btn-default" onclick="javascript:document.getElementById('consoleTextField').value = '';" value="Clear Console Log" />
  25. </div>
  26. </div>
  27. <div class="row">
  28. <div class="col-12 col-xs-12">
  29. <h3>Methods</h3>
  30. </div>
  31. </div>
  32. <div class="row">
  33. <div class="col-12 col-xs-12 col-md-5">
  34. <div style="margin: 5px 5px 0 5px" class="input-group mb-3">
  35. <input id="iTestInput" class="form-control" placeholder="Enter scan code or [key,key,...]" title="Scan code as string or [keyCode,keyCode,...]" />
  36. <div class="input-group-append input-group-btn">
  37. <input type="button" class="btn btn-primary" id="bFireTestInput" onclick="fireTestInput()" value="simulate()">
  38. </div>
  39. </div>
  40. </div>
  41. <div class="col-12 col-xs-12 col-md-7">
  42. <input style="margin: 5px 5px 0 5px" type="button" id="bGenerateonScan" class="btn btn-primary" onclick="initOnScan()" value="attachTo(document)" />
  43. <input style="margin: 5px 5px 0 5px" type="button" id="bDestroyonScan" class="btn btn-primary" onclick="destroyOnScan()" value="detachFrom(document)" />
  44. <input style="margin: 5px 5px 0 5px" type="button" id="bGgetonScanSettings" class="btn btn-primary" onclick="getonScanSettings()" value="getOptions()" />
  45. </div>
  46. </div>
  47. <div class="row">
  48. <div class="col-12 col-xs-12 col-md-6">
  49. <h3>Mode</h3>
  50. <div class="form-group row">
  51. <label class="control-label col-9 col-xs-9 col-sm-7 col-lg-6">reactToKeydown:</label>
  52. <div class="col-3 col-xs-3 col-sm-5 checkbox form-check">
  53. <input id="iAcceptKeyInput" type="checkbox" checked="checked"/>
  54. </div>
  55. </div>
  56. <div class="form-group row">
  57. <label class="control-label col-9 col-xs-9 col-sm-7 col-lg-6">reactToPaste:</label>
  58. <div class="col-3 col-xs-3 col-sm-5 checkbox form-check">
  59. <input id="iAcceptPasteInput" type="checkbox" checked="checked"/>
  60. </div>
  61. </div>
  62. <h3>Events / Callbacks</h3>
  63. <div class="form-group row">
  64. <label class="control-label col-9 col-xs-9 col-sm-7 col-lg-6">onScan:</label>
  65. <div class="col-3 col-xs-3 col-sm-5 checkbox form-check">
  66. <input id="iOnComplete" type="checkbox" checked="checked"/>
  67. </div>
  68. </div>
  69. <div class="form-group row">
  70. <label class="control-label col-9 col-xs-9 col-sm-7 col-lg-6">onScanButtonLongPress:</label>
  71. <div class="col-3 col-xs-3 col-sm-5 checkbox form-check">
  72. <input id="iOnScanButtonLongPressed" type="checkbox" />
  73. </div>
  74. </div>
  75. <div class="form-group row">
  76. <label class="control-label col-9 col-xs-9 col-sm-7 col-lg-6">onScanError:</label>
  77. <div class="col-3 col-xs-3 col-sm-5 checkbox form-check">
  78. <input id="iOnError" type="checkbox" />
  79. </div>
  80. </div>
  81. <div class="form-group row">
  82. <label class="control-label col-9 col-xs-9 col-sm-7 col-lg-6">onKeyDetect:</label>
  83. <div class="col-3 col-xs-3 col-sm-5 checkbox form-check">
  84. <input id="iOnKeyDetect" type="checkbox" />
  85. </div>
  86. </div>
  87. <div class="form-group row">
  88. <label class="control-label col-9 col-xs-9 col-sm-7 col-lg-6">onKeyProcess:</label>
  89. <div class="col-3 col-xs-3 col-sm-5 checkbox form-check">
  90. <input id="iOnKeyProcessed" type="checkbox" />
  91. </div>
  92. </div>
  93. <div class="form-group row">
  94. <label class="control-label col-9 col-xs-9 col-sm-7 col-lg-6">onPaste:</label>
  95. <div class="col-3 col-xs-3 col-sm-5 checkbox form-check">
  96. <input id="iOnPaste" type="checkbox" />
  97. </div>
  98. </div>
  99. <div class="form-group row">
  100. <label class="control-label col-9 col-xs-9 col-sm-7 col-lg-6">Use event handlers, not callbacks:</label>
  101. <div class="col-3 col-xs-3 col-sm-5 checkbox form-check">
  102. <input id="iCompleteHandler" type="checkbox" />
  103. </div>
  104. </div>
  105. </div>
  106. <div class="col-12 col-xs-12 col-md-6">
  107. <h3>Options</h3>
  108. <div class="form-group row">
  109. <label class="control-label col-12 col-xs-12 col-sm-7 col-lg-6">timeBeforeScanTest:</label>
  110. <div class="col-12 col-xs-12 col-sm-5">
  111. <input id="iTimeBeforeScanTest" class="form-control" value="100" />
  112. </div>
  113. </div>
  114. <div class="form-group row">
  115. <label class="control-label col-12 col-xs-12 col-sm-7 col-lg-6">avgTimeByChar:</label>
  116. <div class="col-12 col-xs-12 col-sm-5">
  117. <input id="iAvgTimeByChar" class="form-control" value="30" />
  118. </div>
  119. </div>
  120. <div class="form-group row">
  121. <label class="control-label col-12 col-xs-12 col-sm-7 col-lg-6">minLength:</label>
  122. <div class="col-12 col-xs-12 col-sm-5">
  123. <input id="iMinLength" class="form-control" value="6" />
  124. </div>
  125. </div>
  126. <div class="form-group row">
  127. <label class="control-label col-12 col-xs-12 col-sm-7 col-lg-6">suffixKeyCodes:</label>
  128. <div class="col-12 col-xs-12 col-sm-5">
  129. <input id="iEndChar" class="form-control" value="9,13" />
  130. </div>
  131. </div>
  132. <div class="form-group row">
  133. <label class="control-label col-12 col-xs-12 col-sm-7 col-lg-6">prefixKeyCodes:</label>
  134. <div class="col-12 col-xs-12 col-sm-5">
  135. <input id="iStartChar" class="form-control" value="" />
  136. </div>
  137. </div>
  138. <div class="form-group row">
  139. <label class="control-label col-9 col-xs-9 col-sm-7 col-lg-6">ignoreIfFocusOn:</label>
  140. <div class="col-12 col-xs-12 col-sm-5">
  141. <div class="input-group">
  142. <div class="input-group-prepend input-group-addon">
  143. <div class="input-group-text">
  144. <input id="iIgnoreIfFocusOn" type="checkbox" />
  145. </div>
  146. </div>
  147. <input id="iIgnoreIfFocusOnSelector" class="form-control" value="input" />
  148. </div>
  149. </div>
  150. </div>
  151. <div class="form-group row">
  152. <label class="control-label col-12 col-xs-12 col-sm-7 col-lg-6">scanButtonKeyCode:</label>
  153. <div class="col-12 col-xs-12 col-sm-5">
  154. <input id="iScanButtonKeyCode" class="form-control" value="" />
  155. </div>
  156. </div>
  157. <div class="form-group row">
  158. <label class="control-label col-12 col-xs-12 col-sm-7 col-lg-6">scanButtonLongPressTime:</label>
  159. <div class="col-12 col-xs-12 col-sm-5">
  160. <input id="iScanButtonLongPressThreshold" class="form-control" value="500" />
  161. </div>
  162. </div>
  163. <div class="form-group row">
  164. <label class="control-label col-12 col-xs-12 col-sm-7 col-lg-6">singleScanQty:</label>
  165. <div class="col-12 col-xs-12 col-sm-5">
  166. <input id="iSingleScanQty" class="form-control" value="1" />
  167. </div>
  168. </div>
  169. <div class="form-group row">
  170. <label class="control-label col-9 col-xs-9 col-sm-7 col-lg-6">keyCodeMapper:</label>
  171. <div class="col-3 col-xs-3 col-sm-5 checkbox form-check">
  172. <input id="ikeyCodeMapper" type="checkbox" />
  173. </div>
  174. </div>
  175. <div class="form-group row">
  176. <label class="control-label col-9 col-xs-9 col-sm-7 col-lg-6">stopPropagation:</label>
  177. <div class="col-3 col-xs-3 col-sm-5 checkbox form-check">
  178. <input id="iStopPropagation" type="checkbox" />
  179. </div>
  180. </div>
  181. <div class="form-group row">
  182. <label class="control-label col-9 col-xs-9 col-sm-7 col-lg-6">preventDefault:</label>
  183. <div class="col-3 col-xs-3 col-sm-5 checkbox form-check">
  184. <input id="iPreventDefault" type="checkbox" />
  185. </div>
  186. </div>
  187. </div>
  188. </div>
  189. </form>
  190. </div>
  191. <script type="text/javascript">
  192. if (typeof console != "undefined")
  193. if (typeof console.log != 'undefined')
  194. console.olog = console.log;
  195. else
  196. console.olog = function() {};
  197. console.log = function(message, error) {
  198. console.olog(message);
  199. var oOutput = document.getElementById('consoleTextField');
  200. if (error){
  201. oOutput.value += "ERROR: " + message + '\n';
  202. } else {
  203. oOutput.value += ('> ' + message + '\n');
  204. }
  205. oOutput.scrollTop = oOutput.scrollHeight;
  206. };
  207. console.error = console.debug = console.info = console.log;
  208. window.onerror = function(msg){
  209. console.log(msg, true);
  210. }
  211. function initOnScan(){
  212. var prop;
  213. var array;
  214. var suffixKeyCodes = [];
  215. var prefixKeyCodes = [];
  216. if (document.getElementById("iEndChar").value){
  217. array = document.getElementById("iEndChar").value.split(",");
  218. for (prop in array)
  219. suffixKeyCodes.push(parseInt(array[prop]));
  220. // suffixKeyCodes.push(parseInt(prop));
  221. }
  222. if (document.getElementById("iStartChar").value){
  223. array = document.getElementById("iStartChar").value.split(",")
  224. for (prop in document.getElementById("iStartChar").value.split(","))
  225. prefixKeyCodes.push(parseInt(array[prop]));
  226. }
  227. var options = {
  228. timeBeforeScanTest: parseInt(document.getElementById("iTimeBeforeScanTest").value),
  229. avgTimeByChar: parseInt(document.getElementById("iAvgTimeByChar").value),
  230. minLength: parseInt(document.getElementById("iMinLength").value),
  231. suffixKeyCodes: suffixKeyCodes,
  232. prefixKeyCodes: prefixKeyCodes,
  233. scanButtonLongPressTime: parseInt(document.getElementById("iScanButtonLongPressThreshold").value),
  234. stopPropagation: document.getElementById("iStopPropagation").checked,
  235. preventDefault: document.getElementById("iPreventDefault").checked,
  236. reactToPaste: document.getElementById("iAcceptPasteInput").checked,
  237. reactToKeyDown: document.getElementById("iAcceptKeyInput").checked,
  238. singleScanQty: parseInt(document.getElementById("iSingleScanQty").value)
  239. }
  240. if (document.getElementById("iOnComplete").checked){
  241. options.onScan = function(barcode, qty){
  242. console.log("[onScan]: Code: " + barcode + " Quantity: " + qty);
  243. };
  244. } else {
  245. options.onScan = function(){};
  246. }
  247. if (document.getElementById("iOnError").checked){
  248. options.onScanError = function(err){
  249. var sFormatedErrorString = "Error Details: {\n";
  250. for (var i in err){
  251. sFormatedErrorString += ' ' + i + ': ' + err[i] + ",\n";
  252. }
  253. sFormatedErrorString = sFormatedErrorString.trim().replace(/,$/, '') + "\n}";
  254. console.log("[onScanError]: " + sFormatedErrorString);
  255. };
  256. } else {
  257. options.onScanError = function(){};
  258. }
  259. if (document.getElementById("iOnKeyProcessed").checked){
  260. options.onKeyProcess = function(sChar, oEvent){
  261. console.log('[onKeyProcess]: Processed character "' + sChar + '"');
  262. };
  263. } else {
  264. options.onKeyProcess = function(){};
  265. }
  266. if (document.getElementById("iOnKeyDetect").checked){
  267. options.onKeyDetect = function(iKey, oEvent){
  268. var oEventProps = ''
  269. + 'key:"' + oEvent.key + '", '
  270. + 'ctrlKey:' + oEvent.ctrlKey + ', '
  271. + 'altKey:' + oEvent.altKey + ', '
  272. + 'shiftKey:' + oEvent.shiftKey + ', '
  273. + 'metaKey:' + oEvent.metaKey + ', '
  274. + 'keyCode:' + oEvent.keyCode + ', '
  275. + 'charCode:' + oEvent.charCode + ', ';
  276. console.log('[onKeyDetect]: Detected key code "' + iKey + '". Event dump: ' + oEventProps);
  277. };
  278. } else {
  279. options.onKeyDetect = function(){};
  280. }
  281. if (document.getElementById("iIgnoreIfFocusOn").checked){
  282. document.getElementById("iIgnoreIfFocusOnSelector").removeAttribute("disabled");
  283. options.ignoreIfFocusOn = document.getElementById("iIgnoreIfFocusOnSelector").value;
  284. } else {
  285. options.ignoreIfFocusOn = false;
  286. document.getElementById("iIgnoreIfFocusOnSelector").disabled = "disabled";
  287. }
  288. if (document.getElementById("iScanButtonKeyCode").value){
  289. options.scanButtonKeyCode = parseInt(document.getElementById("iScanButtonKeyCode").value);
  290. } else {
  291. options.scanButtonKeyCode = false;
  292. }
  293. if (document.getElementById("iOnScanButtonLongPressed").checked){
  294. options.onScanButtonLongPress = function(){
  295. console.log("[onScanButtonLongPress]: ScanButton has been long-pressed");
  296. };
  297. } else {
  298. options.onScanButtonLongPress = function(){};
  299. }
  300. if (document.getElementById("iOnPaste").checked){
  301. options.onPaste = function(sPasteString){
  302. console.log("[onPaste]: Data has been pasted: " + sPasteString);
  303. }
  304. } else {
  305. options.onPaste = function(){};
  306. }
  307. if (document.getElementById("iCompleteHandler").checked){
  308. document.addEventListener('scan', scanHandler);
  309. } else {
  310. document.removeEventListener('scan', scanHandler);
  311. }
  312. if (document.getElementById("iCompleteHandler").checked){
  313. document.addEventListener('scanError', scanErrorHandler);
  314. } else {
  315. document.removeEventListener('scanError', scanErrorHandler);
  316. }
  317. if (document.getElementById("ikeyCodeMapper").checked){
  318. options.keyCodeMapper = function (e) {
  319. var iKeyCode = e.which;
  320. var sChar = onScan.decodeKeyEvent(e);
  321. console.log('[keyCodeMapper]: Decoding key code "' + iKeyCode + '" to "' + sChar + '"')
  322. return sChar;
  323. }
  324. }
  325. try {
  326. onScan.attachTo(document, options);
  327. console.log("onScan Started!");
  328. } catch(e) {
  329. onScan.setOptions(document, options);
  330. console.log("onScansettings changed!");
  331. }
  332. }
  333. function destroyOnScan(){
  334. console.log("onScan destroyed!");
  335. onScan.detachFrom(document);
  336. }
  337. function clearTextArea(){
  338. document.getElementById('consoleTextField').value = "";
  339. }
  340. function scanHandler(e){
  341. console.log("[scanHandler]: Code: " + e.detail.code);
  342. }
  343. function scanErrorHandler(e){
  344. var sFormatedErrorString = "Error Details: {\n";
  345. for (var i in e.detail){
  346. sFormatedErrorString += ' ' + i + ': ' + e.detail[i] + ",\n";
  347. }
  348. sFormatedErrorString = sFormatedErrorString.trim().replace(/,$/, '') + "\n}";
  349. console.log("[scanErrorHandler]: " + sFormatedErrorString);
  350. }
  351. function getonScanSettings(){
  352. var sFormatedErrorString = "Scanner Settings: \n";
  353. var aJSONArray = JSON.stringify(onScan.getOptions(document)).split(",");
  354. for (prop = 0; prop < aJSONArray.length - 1; prop++){
  355. if (aJSONArray[prop+1][0] == '\"'){
  356. sFormatedErrorString += aJSONArray[prop] + "," + "\n";
  357. } else {
  358. sFormatedErrorString += aJSONArray[prop] + ",";
  359. }
  360. }
  361. sFormatedErrorString += aJSONArray[aJSONArray.length - 1];
  362. console.log(sFormatedErrorString);
  363. }
  364. function fireTestInput(){
  365. var sInput = (document.getElementById("iTestInput").value || '').trim();
  366. if (sInput.startsWith('[') && sInput.endsWith(']')) {
  367. onScan.simulate(document, JSON.parse(sInput));
  368. } else {
  369. onScan.simulate(document, sInput);
  370. }
  371. }
  372. (function(){
  373. initOnScan();
  374. document.querySelectorAll("#playground input").forEach(function(oInput){
  375. if (oInput.type == 'button' || oInput.readonly) {
  376. return;
  377. }
  378. oInput.addEventListener('change', function(){
  379. console.log('onScan configuration updated');
  380. onScan.detachFrom(document);
  381. initOnScan();
  382. });
  383. });
  384. })();
  385. </script>
  386. </body>
  387. </html>