From 981807d38c737425b9b08f31f3db1f301851e223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20K=C5=99=C3=AD=C5=BE?= Date: Sat, 6 Jan 2018 23:27:33 +0100 Subject: [PATCH 1/3] Mattez patch btns no tabfocus (#1) * Remove spinner buttons form TAB focus As on default `input[type=number]` there is no focus on up/down buttons. And *stepper.js* also does not support keyboard control on the buttons. So we don't need TAB focus on them. * Remove spinner buttons form TAB focus --- demo/index.html | 6 +++--- readme.md | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/demo/index.html b/demo/index.html index 311df0c..fcd9b81 100644 --- a/demo/index.html +++ b/demo/index.html @@ -12,11 +12,11 @@
- - + +
- \ No newline at end of file + diff --git a/readme.md b/readme.md index 8ad12fe..63dbb84 100644 --- a/readme.md +++ b/readme.md @@ -13,8 +13,8 @@ Setting [options](https://github.com/gijsroge/stepper.js#options) is as simple a
- - + +
@@ -39,4 +39,4 @@ debounce: 400, // Time in milliseconds to debounce the change event - https://unpkg.com/stepper.js@1.0.3/dest/stepper.min.js ### Alternatives -- https://github.com/vsn4ik/jquery.spinner \ No newline at end of file +- https://github.com/vsn4ik/jquery.spinner From 826eab52fabec1613bac129e5411b305006423cf Mon Sep 17 00:00:00 2001 From: "Matej Kriz (mattez)" Date: Sat, 6 Jan 2018 23:33:42 +0100 Subject: [PATCH 2/3] Make buttons HTML attributes valid. --- demo/index.html | 4 ++-- readme.md | 4 ++-- src/stepper.js | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/demo/index.html b/demo/index.html index fcd9b81..7387712 100644 --- a/demo/index.html +++ b/demo/index.html @@ -12,8 +12,8 @@
- - + +
diff --git a/readme.md b/readme.md index 63dbb84..75b4755 100644 --- a/readme.md +++ b/readme.md @@ -13,8 +13,8 @@ Setting [options](https://github.com/gijsroge/stepper.js#options) is as simple a
- - + +
diff --git a/src/stepper.js b/src/stepper.js index 9158b3d..b595193 100644 --- a/src/stepper.js +++ b/src/stepper.js @@ -77,9 +77,9 @@ const events = is_touch_device() ? 'touchstart' : 'mousedown'; var _this = this; - spinner.find('[spinner-button]') + spinner.find('[data-spinner-button]') .on(events, function () { - const type = $(this).attr('spinner-button'); + const type = $(this).attr('data-spinner-button'); if (type === 'up') { $.fn.stepper.increase.call(_this); } else { @@ -87,7 +87,7 @@ } }) .on('mousedown', function () { - const type = $(this).attr('spinner-button'); + const type = $(this).attr('data-spinner-button'); $(this).data('timer', setTimeout(() => { timeout = setInterval(() => { if (type === 'up') { From 4305e436cad4c5d7106106e6003a4ee3465eee1c Mon Sep 17 00:00:00 2001 From: "Matej Kriz (mattez)" Date: Sat, 6 Jan 2018 23:45:48 +0100 Subject: [PATCH 3/3] Fix atributes in dest --- dest/stepper.js | 6 +++--- dest/stepper.js.map | 2 +- dest/stepper.min.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dest/stepper.js b/dest/stepper.js index 215647c..a913f12 100644 --- a/dest/stepper.js +++ b/dest/stepper.js @@ -78,15 +78,15 @@ var events = is_touch_device() ? 'touchstart' : 'mousedown'; var _this = this; - spinner.find('[spinner-button]').on(events, function () { - var type = $(this).attr('spinner-button'); + spinner.find('[data-spinner-button]').on(events, function () { + var type = $(this).attr('data-spinner-button'); if (type === 'up') { $.fn.stepper.increase.call(_this); } else { $.fn.stepper.decrease.call(_this); } }).on('mousedown', function () { - var type = $(this).attr('spinner-button'); + var type = $(this).attr('data-spinner-button'); $(this).data('timer', setTimeout(function () { timeout = setInterval(function () { if (type === 'up') { diff --git a/dest/stepper.js.map b/dest/stepper.js.map index 8ff0215..3d28e88 100644 --- a/dest/stepper.js.map +++ b/dest/stepper.js.map @@ -1 +1 @@ -{"version":3,"sources":["stepper.js"],"names":["$","fn","stepper","options","timeout","debounce","func","wait","immediate","context","args","arguments","later","apply","callNow","clearTimeout","setTimeout","is_touch_device","document","createEvent","e","findDecimals","num","split","length","getValue","val","bindEvents","spinner","closest","events","_this","find","on","type","attr","increase","call","decrease","data","setInterval","settings","mouseup","clearInterval","current","parseFloat","decimals","step","newValue","toFixed","currentValue","updateValue","max","min","focus","triggerChange","trigger","each","extend","is","undefined","parseInt","init","jQuery"],"mappings":"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","file":"stepper.js","sourcesContent":["/*jshint esversion: 6 */\r\n(function ($) {\r\n\r\n \"use strict\";\r\n\r\n\r\n $.fn.stepper = function (options) {\r\n\r\n let timeout;\r\n\r\n /**\r\n * Debounce\r\n *\r\n * @returns {Function}\r\n * @param func\r\n * @param wait\r\n * @param immediate\r\n *\r\n * Source: https://davidwalsh.name/javascript-debounce-function\r\n */\r\n const debounce = function (func, wait, immediate) {\r\n let timeout;\r\n return function () {\r\n let context = this, args = arguments;\r\n let later = function () {\r\n timeout = null;\r\n if (!immediate) func.apply(context, args);\r\n };\r\n let callNow = immediate && !timeout;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n if (callNow) func.apply(context, args);\r\n };\r\n };\r\n\r\n /**\r\n * Check if its a touch base device\r\n *\r\n * @returns {boolean}\r\n */\r\n const is_touch_device = function() {\r\n try {\r\n document.createEvent(\"TouchEvent\");\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n /**\r\n * Find the amount of decimals in a number\r\n *\r\n * @param num\r\n * @returns {Number}\r\n *\r\n * Source: http://stackoverflow.com/a/10454534\r\n */\r\n const findDecimals = function (num) {\r\n return (num.split('.')[1] || []).length;\r\n };\r\n\r\n /**\r\n * Get current value\r\n *\r\n * @returns {number}\r\n */\r\n const getValue = function () {\r\n return $(this).val() === '' ? 0 : $(this).val();\r\n };\r\n\r\n /**\r\n * bindEvents\r\n */\r\n const bindEvents = function () {\r\n const spinner = $(this).closest('.js-spinner');\r\n const events = is_touch_device() ? 'touchstart' : 'mousedown';\r\n var _this = this;\r\n\r\n spinner.find('[spinner-button]')\r\n .on(events, function () {\r\n const type = $(this).attr('spinner-button');\r\n if (type === 'up') {\r\n $.fn.stepper.increase.call(_this);\r\n } else {\r\n $.fn.stepper.decrease.call(_this);\r\n }\r\n })\r\n .on('mousedown', function () {\r\n const type = $(this).attr('spinner-button');\r\n $(this).data('timer', setTimeout(() => {\r\n timeout = setInterval(() => {\r\n if (type === 'up') {\r\n $.fn.stepper.increase.call(_this);\r\n } else {\r\n $.fn.stepper.decrease.call(_this);\r\n }\r\n }, 60);\r\n }, _this.settings.debounce));\r\n })\r\n .on('mouseup', function () {\r\n clearTimeout($(this).data('timer'));\r\n });\r\n\r\n $(document).mouseup(function () {\r\n clearInterval(timeout);\r\n });\r\n };\r\n\r\n /**\r\n * Increase\r\n */\r\n $.fn.stepper.increase = function () {\r\n let current = parseFloat(getValue.call(this));\r\n this.settings = $(this).data('settings');\r\n const decimals = findDecimals(this.settings.step);\r\n const newValue = (current + parseFloat(this.settings.step)).toFixed(decimals);\r\n const currentValue = $(this).val();\r\n updateValue.call(this, newValue, currentValue);\r\n };\r\n\r\n /**\r\n * Decrease\r\n */\r\n $.fn.stepper.decrease = function () {\r\n let current = parseFloat(getValue.call(this));\r\n this.settings = $(this).data('settings');\r\n const decimals = findDecimals(this.settings.step);\r\n const newValue = (current - parseFloat(this.settings.step)).toFixed(decimals);\r\n const currentValue = $(this).val();\r\n updateValue.call(this, newValue, currentValue);\r\n };\r\n\r\n /**\r\n * Update stepper element\r\n * @param newValue\r\n * @param currentValue\r\n */\r\n const updateValue = function (newValue, currentValue) {\r\n if ((newValue <= this.settings.max || typeof this.settings.max === \"undefined\") && (newValue >= this.settings.min || typeof this.settings.min === \"undefined\")) {\r\n if(!is_touch_device()){\r\n $(this).val(newValue).focus();\r\n }else{\r\n $(this).val(newValue);\r\n }\r\n triggerChange.call(this);\r\n }else if(currentValue > this.settings.max){\r\n $(this).val(this.settings.max);\r\n }else if(currentValue < this.settings.min){\r\n $(this).val(this.settings.min);\r\n }\r\n };\r\n\r\n /**\r\n * Trigger change event on number field for third party hooks\r\n *\r\n * @type {Function}\r\n */\r\n const triggerChange = debounce(function () {\r\n $(this).trigger('change');\r\n }, 400);\r\n\r\n /**\r\n * Loop every instance\r\n */\r\n return this.each(function () {\r\n\r\n /**\r\n * Default settings merged with user settings\r\n * Can be set trough data attributes or as parameter.\r\n * @type {*}\r\n */\r\n this.settings = $.extend({\r\n step: $(this).is('[step]') ? $(this).attr('step') : '1',\r\n min: $(this).is('[min]') ? parseFloat($(this).attr('min')) : undefined,\r\n max: $(this).is('[max]') ? parseFloat($(this).attr('max')) : undefined,\r\n debounce: $(this).is('[data-stepper-debounce]') ? parseInt($(this).attr('data-stepper-debounce')) : 400,\r\n }, options);\r\n\r\n\r\n this.init = () => {\r\n // Store settings\r\n $(this).data('settings', this.settings);\r\n\r\n // Bind events\r\n bindEvents.call(this);\r\n };\r\n\r\n // Init\r\n this.init();\r\n\r\n });\r\n };\r\n\r\n /**\r\n * Auto load\r\n */\r\n $('input[type=\"number\"]').stepper();\r\n\r\n}(jQuery));"]} \ No newline at end of file +{"version":3,"sources":["stepper.js"],"names":["$","fn","stepper","options","timeout","debounce","func","wait","immediate","context","args","arguments","later","apply","callNow","clearTimeout","setTimeout","is_touch_device","document","createEvent","e","findDecimals","num","split","length","getValue","val","bindEvents","spinner","closest","events","_this","find","on","type","attr","increase","call","decrease","data","setInterval","settings","mouseup","clearInterval","current","parseFloat","decimals","step","newValue","toFixed","currentValue","updateValue","max","min","focus","triggerChange","trigger","each","extend","is","undefined","parseInt","init","jQuery"],"mappings":"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","file":"stepper.js","sourcesContent":["/*jshint esversion: 6 */\r\n(function ($) {\r\n\r\n \"use strict\";\r\n\r\n\r\n $.fn.stepper = function (options) {\r\n\r\n let timeout;\r\n\r\n /**\r\n * Debounce\r\n *\r\n * @returns {Function}\r\n * @param func\r\n * @param wait\r\n * @param immediate\r\n *\r\n * Source: https://davidwalsh.name/javascript-debounce-function\r\n */\r\n const debounce = function (func, wait, immediate) {\r\n let timeout;\r\n return function () {\r\n let context = this, args = arguments;\r\n let later = function () {\r\n timeout = null;\r\n if (!immediate) func.apply(context, args);\r\n };\r\n let callNow = immediate && !timeout;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n if (callNow) func.apply(context, args);\r\n };\r\n };\r\n\r\n /**\r\n * Check if its a touch base device\r\n *\r\n * @returns {boolean}\r\n */\r\n const is_touch_device = function() {\r\n try {\r\n document.createEvent(\"TouchEvent\");\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n /**\r\n * Find the amount of decimals in a number\r\n *\r\n * @param num\r\n * @returns {Number}\r\n *\r\n * Source: http://stackoverflow.com/a/10454534\r\n */\r\n const findDecimals = function (num) {\r\n return (num.split('.')[1] || []).length;\r\n };\r\n\r\n /**\r\n * Get current value\r\n *\r\n * @returns {number}\r\n */\r\n const getValue = function () {\r\n return $(this).val() === '' ? 0 : $(this).val();\r\n };\r\n\r\n /**\r\n * bindEvents\r\n */\r\n const bindEvents = function () {\r\n const spinner = $(this).closest('.js-spinner');\r\n const events = is_touch_device() ? 'touchstart' : 'mousedown';\r\n var _this = this;\r\n\r\n spinner.find('[data-spinner-button]')\r\n .on(events, function () {\r\n const type = $(this).attr('data-spinner-button');\r\n if (type === 'up') {\r\n $.fn.stepper.increase.call(_this);\r\n } else {\r\n $.fn.stepper.decrease.call(_this);\r\n }\r\n })\r\n .on('mousedown', function () {\r\n const type = $(this).attr('data-spinner-button');\r\n $(this).data('timer', setTimeout(() => {\r\n timeout = setInterval(() => {\r\n if (type === 'up') {\r\n $.fn.stepper.increase.call(_this);\r\n } else {\r\n $.fn.stepper.decrease.call(_this);\r\n }\r\n }, 60);\r\n }, _this.settings.debounce));\r\n })\r\n .on('mouseup', function () {\r\n clearTimeout($(this).data('timer'));\r\n });\r\n\r\n $(document).mouseup(function () {\r\n clearInterval(timeout);\r\n });\r\n };\r\n\r\n /**\r\n * Increase\r\n */\r\n $.fn.stepper.increase = function () {\r\n let current = parseFloat(getValue.call(this));\r\n this.settings = $(this).data('settings');\r\n const decimals = findDecimals(this.settings.step);\r\n const newValue = (current + parseFloat(this.settings.step)).toFixed(decimals);\r\n const currentValue = $(this).val();\r\n updateValue.call(this, newValue, currentValue);\r\n };\r\n\r\n /**\r\n * Decrease\r\n */\r\n $.fn.stepper.decrease = function () {\r\n let current = parseFloat(getValue.call(this));\r\n this.settings = $(this).data('settings');\r\n const decimals = findDecimals(this.settings.step);\r\n const newValue = (current - parseFloat(this.settings.step)).toFixed(decimals);\r\n const currentValue = $(this).val();\r\n updateValue.call(this, newValue, currentValue);\r\n };\r\n\r\n /**\r\n * Update stepper element\r\n * @param newValue\r\n * @param currentValue\r\n */\r\n const updateValue = function (newValue, currentValue) {\r\n if ((newValue <= this.settings.max || typeof this.settings.max === \"undefined\") && (newValue >= this.settings.min || typeof this.settings.min === \"undefined\")) {\r\n if(!is_touch_device()){\r\n $(this).val(newValue).focus();\r\n }else{\r\n $(this).val(newValue);\r\n }\r\n triggerChange.call(this);\r\n }else if(currentValue > this.settings.max){\r\n $(this).val(this.settings.max);\r\n }else if(currentValue < this.settings.min){\r\n $(this).val(this.settings.min);\r\n }\r\n };\r\n\r\n /**\r\n * Trigger change event on number field for third party hooks\r\n *\r\n * @type {Function}\r\n */\r\n const triggerChange = debounce(function () {\r\n $(this).trigger('change');\r\n }, 400);\r\n\r\n /**\r\n * Loop every instance\r\n */\r\n return this.each(function () {\r\n\r\n /**\r\n * Default settings merged with user settings\r\n * Can be set trough data attributes or as parameter.\r\n * @type {*}\r\n */\r\n this.settings = $.extend({\r\n step: $(this).is('[step]') ? $(this).attr('step') : '1',\r\n min: $(this).is('[min]') ? parseFloat($(this).attr('min')) : undefined,\r\n max: $(this).is('[max]') ? parseFloat($(this).attr('max')) : undefined,\r\n debounce: $(this).is('[data-stepper-debounce]') ? parseInt($(this).attr('data-stepper-debounce')) : 400,\r\n }, options);\r\n\r\n\r\n this.init = () => {\r\n // Store settings\r\n $(this).data('settings', this.settings);\r\n\r\n // Bind events\r\n bindEvents.call(this);\r\n };\r\n\r\n // Init\r\n this.init();\r\n\r\n });\r\n };\r\n\r\n /**\r\n * Auto load\r\n */\r\n $('input[type=\"number\"]').stepper();\r\n\r\n}(jQuery));"]} \ No newline at end of file diff --git a/dest/stepper.min.js b/dest/stepper.min.js index 1b50aec..49aaae6 100644 --- a/dest/stepper.min.js +++ b/dest/stepper.min.js @@ -1 +1 @@ -"use strict";!function(t){t.fn.stepper=function(s){var i=void 0,e=function(t,s,i){var e=void 0;return function(){var n=this,a=arguments,r=function(){e=null,i||t.apply(n,a)},o=i&&!e;clearTimeout(e),e=setTimeout(r,s),o&&t.apply(n,a)}},n=function(){try{return document.createEvent("TouchEvent"),!0}catch(t){return!1}},a=function(t){return(t.split(".")[1]||[]).length},r=function(){return""===t(this).val()?0:t(this).val()},o=function(){var s=t(this).closest(".js-spinner"),e=n()?"touchstart":"mousedown",a=this;s.find("[spinner-button]").on(e,function(){var s=t(this).attr("spinner-button");"up"===s?t.fn.stepper.increase.call(a):t.fn.stepper.decrease.call(a)}).on("mousedown",function(){var s=t(this).attr("spinner-button");t(this).data("timer",setTimeout(function(){i=setInterval(function(){"up"===s?t.fn.stepper.increase.call(a):t.fn.stepper.decrease.call(a)},60)},a.settings.debounce))}).on("mouseup",function(){clearTimeout(t(this).data("timer"))}),t(document).mouseup(function(){clearInterval(i)})};t.fn.stepper.increase=function(){var s=parseFloat(r.call(this));this.settings=t(this).data("settings");var i=a(this.settings.step),e=(s+parseFloat(this.settings.step)).toFixed(i),n=t(this).val();u.call(this,e,n)},t.fn.stepper.decrease=function(){var s=parseFloat(r.call(this));this.settings=t(this).data("settings");var i=a(this.settings.step),e=(s-parseFloat(this.settings.step)).toFixed(i),n=t(this).val();u.call(this,e,n)};var u=function(s,i){(s<=this.settings.max||"undefined"==typeof this.settings.max)&&(s>=this.settings.min||"undefined"==typeof this.settings.min)?(n()?t(this).val(s):t(this).val(s).focus(),c.call(this)):i>this.settings.max?t(this).val(this.settings.max):i=this.settings.min||"undefined"==typeof this.settings.min)?(n()?t(this).val(s):t(this).val(s).focus(),c.call(this)):i>this.settings.max?t(this).val(this.settings.max):i