From 23c58063ac61d080ffe4852a8a0287401a992fac Mon Sep 17 00:00:00 2001 From: Simon Sturgess Date: Mon, 2 Nov 2015 13:12:10 +0000 Subject: [PATCH 1/7] Conditionally removing selected class from trigger if an option has a blank value. --- fancySelect.coffee | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fancySelect.coffee b/fancySelect.coffee index 26de6bd..277d561 100644 --- a/fancySelect.coffee +++ b/fancySelect.coffee @@ -148,7 +148,10 @@ $.fn.fancySelect = (opts = {}) -> options.find('.selected').removeClass('selected') clicked.addClass 'selected' - trigger.addClass 'selected' + if clicked.data('raw-value') === '' + trigger.removeClass 'selected' + else + trigger.addClass 'selected' return sel.val(clicked.data('raw-value')).trigger('change.fs').trigger('blur.fs').trigger('focus.fs') # handle mouse selection From 731a6b72da8a32ec85e5c27baf72f790dca1a358 Mon Sep 17 00:00:00 2001 From: Simon Sturgess Date: Mon, 2 Nov 2015 13:12:57 +0000 Subject: [PATCH 2/7] Conditionally removing selected class from trigger if an option has a blank value. --- fancySelect.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fancySelect.js b/fancySelect.js index 4bd378a..e3d9b24 100644 --- a/fancySelect.js +++ b/fancySelect.js @@ -162,7 +162,11 @@ } options.find('.selected').removeClass('selected'); clicked.addClass('selected'); - trigger.addClass('selected'); + if(clicked.data('raw-value') === '') { + trigger.removeClass('selected'); + } else { + trigger.addClass('selected'); + } return sel.val(clicked.data('raw-value')).trigger('change.fs').trigger('blur.fs').trigger('focus.fs'); }); options.on('mouseenter.fs', 'li', function() { From 2923829d36d577227419f0aac6b90cbcdbffa22b Mon Sep 17 00:00:00 2001 From: dahliacreative Date: Wed, 4 Nov 2015 09:13:42 +0000 Subject: [PATCH 3/7] fixing coffee source --- fancySelect.coffee | 5 +- fancySelect.js | 377 ++++++++++++++++++++++----------------------- 2 files changed, 186 insertions(+), 196 deletions(-) diff --git a/fancySelect.coffee b/fancySelect.coffee index 277d561..4df345c 100644 --- a/fancySelect.coffee +++ b/fancySelect.coffee @@ -148,10 +148,7 @@ $.fn.fancySelect = (opts = {}) -> options.find('.selected').removeClass('selected') clicked.addClass 'selected' - if clicked.data('raw-value') === '' - trigger.removeClass 'selected' - else - trigger.addClass 'selected' + trigger.toggleClass 'selected', clicked.data('raw-value') != '' return sel.val(clicked.data('raw-value')).trigger('change.fs').trigger('blur.fs').trigger('focus.fs') # handle mouse selection diff --git a/fancySelect.js b/fancySelect.js index e3d9b24..a97ba45 100644 --- a/fancySelect.js +++ b/fancySelect.js @@ -1,210 +1,203 @@ -// Generated by CoffeeScript 1.4.0 -(function() { - var $; +var $; - $ = window.jQuery || window.Zepto || window.$; +$ = window.jQuery || window.Zepto || window.$; - $.fn.fancySelect = function(opts) { - var isiOS, settings; - if (opts == null) { - opts = {}; +$.fn.fancySelect = function(opts) { + var isiOS, settings; + if (opts == null) { + opts = {}; + } + settings = $.extend({ + forceiOS: false, + includeBlank: false, + optionTemplate: function(optionEl) { + return optionEl.text(); + }, + triggerTemplate: function(optionEl) { + return optionEl.text(); } - settings = $.extend({ - forceiOS: false, - includeBlank: false, - optionTemplate: function(optionEl) { - return optionEl.text(); - }, - triggerTemplate: function(optionEl) { - return optionEl.text(); - } - }, opts); - isiOS = !!navigator.userAgent.match(/iP(hone|od|ad)/i); - return this.each(function() { - var copyOptionsToList, disabled, options, sel, trigger, updateTriggerText, wrapper; - sel = $(this); - if (sel.hasClass('fancified') || sel[0].tagName !== 'SELECT') { - return; - } - sel.addClass('fancified'); - sel.css({ - width: 1, - height: 1, - display: 'block', - position: 'absolute', - top: 0, - left: 0, - opacity: 0 - }); - sel.wrap('
'); - wrapper = sel.parent(); - if (sel.data('class')) { - wrapper.addClass(sel.data('class')); - } - wrapper.append('
'); - if (!(isiOS && !settings.forceiOS)) { - wrapper.append('
    '); - } - trigger = wrapper.find('.trigger'); - options = wrapper.find('.options'); - disabled = sel.prop('disabled'); - if (disabled) { - wrapper.addClass('disabled'); + }, opts); + isiOS = !!navigator.userAgent.match(/iP(hone|od|ad)/i); + return this.each(function() { + var copyOptionsToList, disabled, options, sel, trigger, updateTriggerText, wrapper; + sel = $(this); + if (sel.hasClass('fancified') || sel[0].tagName !== 'SELECT') { + return; + } + sel.addClass('fancified'); + sel.css({ + width: 1, + height: 1, + display: 'block', + position: 'absolute', + top: 0, + left: 0, + opacity: 0 + }); + sel.wrap('
    '); + wrapper = sel.parent(); + if (sel.data('class')) { + wrapper.addClass(sel.data('class')); + } + wrapper.append('
    '); + if (!(isiOS && !settings.forceiOS)) { + wrapper.append('
      '); + } + trigger = wrapper.find('.trigger'); + options = wrapper.find('.options'); + disabled = sel.prop('disabled'); + if (disabled) { + wrapper.addClass('disabled'); + } + updateTriggerText = function() { + var triggerHtml; + triggerHtml = settings.triggerTemplate(sel.find(':selected')); + return trigger.html(triggerHtml); + }; + sel.on('blur.fs', function() { + if (trigger.hasClass('open')) { + return setTimeout(function() { + return trigger.trigger('close.fs'); + }, 120); } - updateTriggerText = function() { - var triggerHtml; - triggerHtml = settings.triggerTemplate(sel.find(':selected')); - return trigger.html(triggerHtml); - }; - sel.on('blur.fs', function() { - if (trigger.hasClass('open')) { - return setTimeout(function() { - return trigger.trigger('close.fs'); - }, 120); - } - }); - trigger.on('close.fs', function() { - trigger.removeClass('open'); - return options.removeClass('open'); - }); - trigger.on('click.fs', function() { - var offParent, parent; - if (!disabled) { - trigger.toggleClass('open'); - if (isiOS && !settings.forceiOS) { - if (trigger.hasClass('open')) { - return sel.focus(); - } - } else { - if (trigger.hasClass('open')) { - parent = trigger.parent(); - offParent = parent.offsetParent(); - if ((parent.offset().top + parent.outerHeight() + options.outerHeight() + 20) > $(window).height() + $(window).scrollTop()) { - options.addClass('overflowing'); - } else { - options.removeClass('overflowing'); - } - } - options.toggleClass('open'); - if (!isiOS) { - return sel.focus(); - } - } - } - }); - sel.on('enable', function() { - sel.prop('disabled', false); - wrapper.removeClass('disabled'); - disabled = false; - return copyOptionsToList(); - }); - sel.on('disable', function() { - sel.prop('disabled', true); - wrapper.addClass('disabled'); - return disabled = true; - }); - sel.on('change.fs', function(e) { - if (e.originalEvent && e.originalEvent.isTrusted) { - return e.stopPropagation(); - } else { - return updateTriggerText(); - } - }); - sel.on('keydown', function(e) { - var hovered, newHovered, w; - w = e.which; - hovered = options.find('.hover'); - hovered.removeClass('hover'); - if (!options.hasClass('open')) { - if (w === 13 || w === 32 || w === 38 || w === 40) { - e.preventDefault(); - return trigger.trigger('click.fs'); + }); + trigger.on('close.fs', function() { + trigger.removeClass('open'); + return options.removeClass('open'); + }); + trigger.on('click.fs', function() { + var offParent, parent; + if (!disabled) { + trigger.toggleClass('open'); + if (isiOS && !settings.forceiOS) { + if (trigger.hasClass('open')) { + return sel.focus(); } } else { - if (w === 38) { - e.preventDefault(); - if (hovered.length && hovered.index() > 0) { - hovered.prev().addClass('hover'); - } else { - options.find('li:last-child').addClass('hover'); - } - } else if (w === 40) { - e.preventDefault(); - if (hovered.length && hovered.index() < options.find('li').length - 1) { - hovered.next().addClass('hover'); + if (trigger.hasClass('open')) { + parent = trigger.parent(); + offParent = parent.offsetParent(); + if ((parent.offset().top + parent.outerHeight() + options.outerHeight() + 20) > $(window).height() + $(window).scrollTop()) { + options.addClass('overflowing'); } else { - options.find('li:first-child').addClass('hover'); - } - } else if (w === 27) { - e.preventDefault(); - trigger.trigger('click.fs'); - } else if (w === 13 || w === 32) { - e.preventDefault(); - hovered.trigger('mousedown.fs'); - } else if (w === 9) { - if (trigger.hasClass('open')) { - trigger.trigger('close.fs'); + options.removeClass('overflowing'); } } - newHovered = options.find('.hover'); - if (newHovered.length) { - options.scrollTop(0); - return options.scrollTop(newHovered.position().top - 12); + options.toggleClass('open'); + if (!isiOS) { + return sel.focus(); } } - }); - options.on('mousedown.fs', 'li', function(e) { - var clicked; - clicked = $(this); - sel.val(clicked.data('raw-value')); - if (!isiOS) { - sel.trigger('blur.fs').trigger('focus.fs'); + } + }); + sel.on('enable', function() { + sel.prop('disabled', false); + wrapper.removeClass('disabled'); + disabled = false; + return copyOptionsToList(); + }); + sel.on('disable', function() { + sel.prop('disabled', true); + wrapper.addClass('disabled'); + return disabled = true; + }); + sel.on('change.fs', function(e) { + if (e.originalEvent && e.originalEvent.isTrusted) { + return e.stopPropagation(); + } else { + return updateTriggerText(); + } + }); + sel.on('keydown', function(e) { + var hovered, newHovered, w; + w = e.which; + hovered = options.find('.hover'); + hovered.removeClass('hover'); + if (!options.hasClass('open')) { + if (w === 13 || w === 32 || w === 38 || w === 40) { + e.preventDefault(); + return trigger.trigger('click.fs'); } - options.find('.selected').removeClass('selected'); - clicked.addClass('selected'); - if(clicked.data('raw-value') === '') { - trigger.removeClass('selected'); - } else { - trigger.addClass('selected'); + } else { + if (w === 38) { + e.preventDefault(); + if (hovered.length && hovered.index() > 0) { + hovered.prev().addClass('hover'); + } else { + options.find('li:last-child').addClass('hover'); + } + } else if (w === 40) { + e.preventDefault(); + if (hovered.length && hovered.index() < options.find('li').length - 1) { + hovered.next().addClass('hover'); + } else { + options.find('li:first-child').addClass('hover'); + } + } else if (w === 27) { + e.preventDefault(); + trigger.trigger('click.fs'); + } else if (w === 13 || w === 32) { + e.preventDefault(); + hovered.trigger('mousedown.fs'); + } else if (w === 9) { + if (trigger.hasClass('open')) { + trigger.trigger('close.fs'); + } } - return sel.val(clicked.data('raw-value')).trigger('change.fs').trigger('blur.fs').trigger('focus.fs'); - }); - options.on('mouseenter.fs', 'li', function() { - var hovered, nowHovered; - nowHovered = $(this); - hovered = options.find('.hover'); - hovered.removeClass('hover'); - return nowHovered.addClass('hover'); - }); - options.on('mouseleave.fs', 'li', function() { - return options.find('.hover').removeClass('hover'); - }); - copyOptionsToList = function() { - var selOpts; - updateTriggerText(); - if (isiOS && !settings.forceiOS) { - return; + newHovered = options.find('.hover'); + if (newHovered.length) { + options.scrollTop(0); + return options.scrollTop(newHovered.position().top - 12); } - selOpts = sel.find('option'); - return sel.find('option').each(function(i, opt) { - var optHtml; - opt = $(opt); - if (!opt.prop('disabled') && (opt.val() || settings.includeBlank)) { - optHtml = settings.optionTemplate(opt); - if (opt.prop('selected')) { - return options.append("
    • " + optHtml + "
    • "); - } else { - return options.append("
    • " + optHtml + "
    • "); - } + } + }); + options.on('mousedown.fs', 'li', function(e) { + var clicked; + clicked = $(this); + sel.val(clicked.data('raw-value')); + if (!isiOS) { + sel.trigger('blur.fs').trigger('focus.fs'); + } + options.find('.selected').removeClass('selected'); + clicked.addClass('selected'); + trigger.toggleClass('selected', clicked.data('raw-value') !== ''); + return sel.val(clicked.data('raw-value')).trigger('change.fs').trigger('blur.fs').trigger('focus.fs'); + }); + options.on('mouseenter.fs', 'li', function() { + var hovered, nowHovered; + nowHovered = $(this); + hovered = options.find('.hover'); + hovered.removeClass('hover'); + return nowHovered.addClass('hover'); + }); + options.on('mouseleave.fs', 'li', function() { + return options.find('.hover').removeClass('hover'); + }); + copyOptionsToList = function() { + var selOpts; + updateTriggerText(); + if (isiOS && !settings.forceiOS) { + return; + } + selOpts = sel.find('option'); + return sel.find('option').each(function(i, opt) { + var optHtml; + opt = $(opt); + if (!opt.prop('disabled') && (opt.val() || settings.includeBlank)) { + optHtml = settings.optionTemplate(opt); + if (opt.prop('selected')) { + return options.append("
    • " + optHtml + "
    • "); + } else { + return options.append("
    • " + optHtml + "
    • "); } - }); - }; - sel.on('update.fs', function() { - wrapper.find('.options').empty(); - return copyOptionsToList(); + } }); + }; + sel.on('update.fs', function() { + wrapper.find('.options').empty(); return copyOptionsToList(); }); - }; - -}).call(this); + return copyOptionsToList(); + }); +}; +RunLink \ No newline at end of file From 6cd1f33edea3dd8d22fb3c30b5cebfdf0322feda Mon Sep 17 00:00:00 2001 From: Simon Sturgess Date: Wed, 4 Nov 2015 10:18:50 +0000 Subject: [PATCH 4/7] Update fancySelect.js --- fancySelect.js | 1 - 1 file changed, 1 deletion(-) diff --git a/fancySelect.js b/fancySelect.js index a97ba45..008c226 100644 --- a/fancySelect.js +++ b/fancySelect.js @@ -200,4 +200,3 @@ $.fn.fancySelect = function(opts) { return copyOptionsToList(); }); }; -RunLink \ No newline at end of file From 71fdadae0785f04518e9947ba9433b07574ead17 Mon Sep 17 00:00:00 2001 From: dahliacreative Date: Wed, 4 Nov 2015 10:44:46 +0000 Subject: [PATCH 5/7] Adding type to go to option --- fancySelect.coffee | 381 ++++++++++++++++++++++---------------------- fancySelect.js | 386 +++++++++++++++++++++++---------------------- 2 files changed, 394 insertions(+), 373 deletions(-) diff --git a/fancySelect.coffee b/fancySelect.coffee index 4df345c..acbbb77 100644 --- a/fancySelect.coffee +++ b/fancySelect.coffee @@ -1,194 +1,199 @@ -$ = window.jQuery || window.Zepto || window.$ - -$.fn.fancySelect = (opts = {}) -> - settings = $.extend({ - forceiOS: false - includeBlank: false - optionTemplate: (optionEl) -> - return optionEl.text() - triggerTemplate: (optionEl) -> - return optionEl.text() - }, opts) - - isiOS = !!navigator.userAgent.match /iP(hone|od|ad)/i - - return this.each -> - sel = $(this) - return if sel.hasClass('fancified') || sel[0].tagName != 'SELECT' - sel.addClass('fancified') - - # hide the native select - sel.css - width: 1 - height: 1 - display: 'block' - position: 'absolute' - top: 0 - left: 0 - opacity: 0 - - # some global setup stuff - sel.wrap '
      ' - wrapper = sel.parent() - - wrapper.addClass(sel.data('class')) if sel.data('class') - - wrapper.append '
      ' - wrapper.append '
        ' unless isiOS && !settings.forceiOS - - trigger = wrapper.find '.trigger' - options = wrapper.find '.options' - - # disabled in markup? - disabled = sel.prop('disabled') - if disabled - wrapper.addClass 'disabled' - - updateTriggerText = -> - triggerHtml = settings.triggerTemplate(sel.find(':selected')) - trigger.html(triggerHtml) - - sel.on 'blur.fs', -> - if trigger.hasClass 'open' - setTimeout -> - trigger.trigger 'close.fs' - , 120 - - trigger.on 'close.fs', -> - trigger.removeClass 'open' - options.removeClass 'open' - - trigger.on 'click.fs', -> - unless disabled - trigger.toggleClass 'open' - - # fancySelect defaults to using native selects with a styled trigger on mobile - # don't show the options if we're on mobile and haven't set `forceiOS` - if isiOS && !settings.forceiOS - if trigger.hasClass 'open' - sel.focus() +(-> + $ = window.jQuery or window.Zepto or window.$ + + $.fn.fancySelect = (opts) -> + isiOS = undefined + settings = undefined + if opts == null + opts = {} + settings = $.extend({ + forceiOS: false + includeBlank: false + optionTemplate: (optionEl) -> + optionEl.text() + triggerTemplate: (optionEl) -> + optionEl.text() + + }, opts) + isiOS = ! !navigator.userAgent.match(/iP(hone|od|ad)/i) + @each -> + copyOptionsToList = undefined + disabled = undefined + options = undefined + sel = undefined + trigger = undefined + updateTriggerText = undefined + wrapper = undefined + searchTerm = '' + searchTimeout = undefined + sel = $(this) + if sel.hasClass('fancified') or sel[0].tagName != 'SELECT' + return + sel.addClass 'fancified' + sel.css + width: 1 + height: 1 + display: 'block' + position: 'absolute' + top: 0 + left: 0 + opacity: 0 + sel.wrap '
        ' + wrapper = sel.parent() + if sel.data('class') + wrapper.addClass sel.data('class') + wrapper.append '
        ' + if !(isiOS and !settings.forceiOS) + wrapper.append '
          ' + trigger = wrapper.find('.trigger') + options = wrapper.find('.options') + disabled = sel.prop('disabled') + if disabled + wrapper.addClass 'disabled' + + updateTriggerText = -> + triggerHtml = undefined + triggerHtml = settings.triggerTemplate(sel.find(':selected')) + trigger.html triggerHtml + + sel.on 'blur.fs', -> + if trigger.hasClass('open') + return setTimeout((-> + trigger.trigger 'close.fs' + ), 120) + return + trigger.on 'close.fs', -> + trigger.removeClass 'open' + options.removeClass 'open' + trigger.on 'click.fs', -> + offParent = undefined + parent = undefined + if !disabled + trigger.toggleClass 'open' + if isiOS and !settings.forceiOS + if trigger.hasClass('open') + return sel.focus() + else + if trigger.hasClass('open') + parent = trigger.parent() + offParent = parent.offsetParent() + if parent.offset().top + parent.outerHeight() + options.outerHeight() + 20 > $(window).height() + $(window).scrollTop() + options.addClass 'overflowing' + else + options.removeClass 'overflowing' + options.toggleClass 'open' + if !isiOS + return sel.focus() + return + sel.on 'enable', -> + sel.prop 'disabled', false + wrapper.removeClass 'disabled' + disabled = false + copyOptionsToList() + sel.on 'disable', -> + sel.prop 'disabled', true + wrapper.addClass 'disabled' + disabled = true + sel.on 'change.fs', (e) -> + if e.originalEvent and e.originalEvent.isTrusted + e.stopPropagation() else - if trigger.hasClass 'open' - parent = trigger.parent() - offParent = parent.offsetParent() - - # TODO 20 is very static - if (parent.offset().top + parent.outerHeight() + options.outerHeight() + 20) > $(window).height() + $(window).scrollTop() - options.addClass 'overflowing' + updateTriggerText() + sel.on 'keydown', (e) -> + hovered = undefined + newHovered = undefined + w = undefined + w = e.which + hovered = options.find('.hover') + hovered.removeClass 'hover' + if !options.hasClass('open') + if w == 13 or w == 32 or w == 38 or w == 40 + e.preventDefault() + return trigger.trigger('click.fs') + else + if w == 38 + e.preventDefault() + if hovered.length and hovered.index() > 0 + hovered.prev().addClass 'hover' else - options.removeClass 'overflowing' - - options.toggleClass 'open' - - sel.focus() unless isiOS - - sel.on 'enable', -> - sel.prop 'disabled', false - wrapper.removeClass 'disabled' - disabled = false - copyOptionsToList() - - sel.on 'disable', -> - sel.prop 'disabled', true - wrapper.addClass 'disabled' - disabled = true - - sel.on 'change.fs', (e) -> - if e.originalEvent && e.originalEvent.isTrusted - # discard firefox-only automatic event when hitting enter, we want to trigger our own - e.stopPropagation() - else - updateTriggerText() - - # keyboard control - sel.on 'keydown', (e) -> - w = e.which - hovered = options.find('.hover') - hovered.removeClass('hover') - - if !options.hasClass('open') - if w in [13, 32, 38, 40] # enter, space, up, down - e.preventDefault() - trigger.trigger 'click.fs' - else - if w == 38 # up - e.preventDefault() - if hovered.length && hovered.index() > 0 # move up - hovered.prev().addClass('hover') - else # move to bottom - options.find('li:last-child').addClass('hover') - else if w == 40 # down - e.preventDefault() - if hovered.length && hovered.index() < options.find('li').length - 1 # move down - hovered.next().addClass('hover') - else # move to top - options.find('li:first-child').addClass('hover') - else if w == 27 # escape - e.preventDefault() - trigger.trigger 'click.fs' - else if w in [13, 32] # enter, space - e.preventDefault() - hovered.trigger 'mousedown.fs' - else if w == 9 # tab - if trigger.hasClass 'open' then trigger.trigger 'close.fs' - - newHovered = options.find('.hover') - if newHovered.length - options.scrollTop 0 - options.scrollTop newHovered.position().top - 12 - - # Handle item selection, and - # Add class selected to selected item - options.on 'mousedown.fs', 'li', (e) -> - clicked = $(this) - - sel.val(clicked.data('raw-value')) - - sel.trigger('blur.fs').trigger('focus.fs') unless isiOS - - options.find('.selected').removeClass('selected') - clicked.addClass 'selected' - trigger.toggleClass 'selected', clicked.data('raw-value') != '' - return sel.val(clicked.data('raw-value')).trigger('change.fs').trigger('blur.fs').trigger('focus.fs') - - # handle mouse selection - options.on 'mouseenter.fs', 'li', -> - nowHovered = $(this) - hovered = options.find('.hover') - hovered.removeClass 'hover' - - nowHovered.addClass 'hover' - - options.on 'mouseleave.fs', 'li', -> - options.find('.hover').removeClass('hover') - - copyOptionsToList = -> - # update our trigger to reflect the select (it really already should, this is just a safety) - updateTriggerText() - - return if isiOS && !settings.forceiOS - - # snag current options before we add a default one - selOpts = sel.find 'option' - - # generate list of options for the fancySelect - - sel.find('option').each (i, opt) -> - opt = $(opt) - - if !opt.prop('disabled') && (opt.val() || settings.includeBlank) - # Generate the inner HTML for the option from our template - optHtml = settings.optionTemplate(opt) - - # Is there a select option on page load? - if opt.prop('selected') - options.append "
        • #{optHtml}
        • " + options.find('li:last-child').addClass 'hover' + else if w == 40 + e.preventDefault() + if hovered.length and hovered.index() < options.find('li').length - 1 + hovered.next().addClass 'hover' + else + options.find('li:first-child').addClass 'hover' + else if w == 27 + e.preventDefault() + trigger.trigger 'click.fs' + else if w == 13 + e.preventDefault() + hovered.trigger 'mousedown.fs' + else if w == 9 + if trigger.hasClass('open') + trigger.trigger 'close.fs' else - options.append "
        • #{optHtml}
        • " + clearTimeout searchTimeout + searchTimeout = setTimeout((-> + searchTerm = '' + return + ), 500) + searchTerm += String.fromCharCode(w).toLowerCase() + optCount = options.find('li').length + 1 + i = 1 + while i < optCount + current = options.find('li:nth-child(' + i + ')') + text = current.text() + if text.toLowerCase().indexOf(searchTerm) >= 0 + current.addClass 'hover' + return + i++ + newHovered = options.find('.hover') + if newHovered.length + options.scrollTop 0 + return options.scrollTop(newHovered.position().top - 12) + return + options.on 'mousedown.fs', 'li', (e) -> + clicked = undefined + clicked = $(this) + sel.val clicked.data('raw-value') + if !isiOS + sel.trigger('blur.fs').trigger 'focus.fs' + options.find('.selected').removeClass 'selected' + clicked.addClass 'selected' + trigger.toggleClass 'selected', clicked.data('raw-value') != '' + sel.val(clicked.data('raw-value')).trigger('change.fs').trigger('blur.fs').trigger 'focus.fs' + options.on 'mouseenter.fs', 'li', -> + hovered = undefined + nowHovered = undefined + nowHovered = $(this) + hovered = options.find('.hover') + hovered.removeClass 'hover' + nowHovered.addClass 'hover' + options.on 'mouseleave.fs', 'li', -> + options.find('.hover').removeClass 'hover' + + copyOptionsToList = -> + selOpts = undefined + updateTriggerText() + if isiOS and !settings.forceiOS + return + selOpts = sel.find('option') + sel.find('option').each (i, opt) -> + optHtml = undefined + opt = $(opt) + if !opt.prop('disabled') and (opt.val() or settings.includeBlank) + optHtml = settings.optionTemplate(opt) + if opt.prop('selected') + return options.append('
        • ' + optHtml + '
        • ') + else + return options.append('
        • ' + optHtml + '
        • ') + return - # for updating the list of options after initialization - sel.on 'update.fs', -> - wrapper.find('.options').empty() + sel.on 'update.fs', -> + wrapper.find('.options').empty() + copyOptionsToList() copyOptionsToList() - copyOptionsToList() + return +).call this \ No newline at end of file diff --git a/fancySelect.js b/fancySelect.js index a97ba45..0b52a01 100644 --- a/fancySelect.js +++ b/fancySelect.js @@ -1,203 +1,219 @@ -var $; +(function() { + var $; -$ = window.jQuery || window.Zepto || window.$; + $ = window.jQuery || window.Zepto || window.$; -$.fn.fancySelect = function(opts) { - var isiOS, settings; - if (opts == null) { - opts = {}; - } - settings = $.extend({ - forceiOS: false, - includeBlank: false, - optionTemplate: function(optionEl) { - return optionEl.text(); - }, - triggerTemplate: function(optionEl) { - return optionEl.text(); + $.fn.fancySelect = function(opts) { + var isiOS, settings; + if (opts == null) { + opts = {}; } - }, opts); - isiOS = !!navigator.userAgent.match(/iP(hone|od|ad)/i); - return this.each(function() { - var copyOptionsToList, disabled, options, sel, trigger, updateTriggerText, wrapper; - sel = $(this); - if (sel.hasClass('fancified') || sel[0].tagName !== 'SELECT') { - return; - } - sel.addClass('fancified'); - sel.css({ - width: 1, - height: 1, - display: 'block', - position: 'absolute', - top: 0, - left: 0, - opacity: 0 - }); - sel.wrap('
          '); - wrapper = sel.parent(); - if (sel.data('class')) { - wrapper.addClass(sel.data('class')); - } - wrapper.append('
          '); - if (!(isiOS && !settings.forceiOS)) { - wrapper.append('
            '); - } - trigger = wrapper.find('.trigger'); - options = wrapper.find('.options'); - disabled = sel.prop('disabled'); - if (disabled) { - wrapper.addClass('disabled'); - } - updateTriggerText = function() { - var triggerHtml; - triggerHtml = settings.triggerTemplate(sel.find(':selected')); - return trigger.html(triggerHtml); - }; - sel.on('blur.fs', function() { - if (trigger.hasClass('open')) { - return setTimeout(function() { - return trigger.trigger('close.fs'); - }, 120); + settings = $.extend({ + forceiOS: false, + includeBlank: false, + optionTemplate: function(optionEl) { + return optionEl.text(); + }, + triggerTemplate: function(optionEl) { + return optionEl.text(); } - }); - trigger.on('close.fs', function() { - trigger.removeClass('open'); - return options.removeClass('open'); - }); - trigger.on('click.fs', function() { - var offParent, parent; - if (!disabled) { - trigger.toggleClass('open'); - if (isiOS && !settings.forceiOS) { - if (trigger.hasClass('open')) { - return sel.focus(); - } - } else { - if (trigger.hasClass('open')) { - parent = trigger.parent(); - offParent = parent.offsetParent(); - if ((parent.offset().top + parent.outerHeight() + options.outerHeight() + 20) > $(window).height() + $(window).scrollTop()) { - options.addClass('overflowing'); - } else { - options.removeClass('overflowing'); - } - } - options.toggleClass('open'); - if (!isiOS) { - return sel.focus(); - } - } + }, opts); + isiOS = !!navigator.userAgent.match(/iP(hone|od|ad)/i); + return this.each(function() { + var copyOptionsToList, disabled, options, sel, trigger, updateTriggerText, wrapper, searchTerm = '', searchTimeout; + sel = $(this); + if (sel.hasClass('fancified') || sel[0].tagName !== 'SELECT') { + return; } - }); - sel.on('enable', function() { - sel.prop('disabled', false); - wrapper.removeClass('disabled'); - disabled = false; - return copyOptionsToList(); - }); - sel.on('disable', function() { - sel.prop('disabled', true); - wrapper.addClass('disabled'); - return disabled = true; - }); - sel.on('change.fs', function(e) { - if (e.originalEvent && e.originalEvent.isTrusted) { - return e.stopPropagation(); - } else { - return updateTriggerText(); + sel.addClass('fancified'); + sel.css({ + width: 1, + height: 1, + display: 'block', + position: 'absolute', + top: 0, + left: 0, + opacity: 0 + }); + sel.wrap('
            '); + wrapper = sel.parent(); + if (sel.data('class')) { + wrapper.addClass(sel.data('class')); } - }); - sel.on('keydown', function(e) { - var hovered, newHovered, w; - w = e.which; - hovered = options.find('.hover'); - hovered.removeClass('hover'); - if (!options.hasClass('open')) { - if (w === 13 || w === 32 || w === 38 || w === 40) { - e.preventDefault(); - return trigger.trigger('click.fs'); + wrapper.append('
            '); + if (!(isiOS && !settings.forceiOS)) { + wrapper.append('
              '); + } + trigger = wrapper.find('.trigger'); + options = wrapper.find('.options'); + disabled = sel.prop('disabled'); + if (disabled) { + wrapper.addClass('disabled'); + } + updateTriggerText = function() { + var triggerHtml; + triggerHtml = settings.triggerTemplate(sel.find(':selected')); + return trigger.html(triggerHtml); + }; + sel.on('blur.fs', function() { + if (trigger.hasClass('open')) { + return setTimeout(function() { + return trigger.trigger('close.fs'); + }, 120); } - } else { - if (w === 38) { - e.preventDefault(); - if (hovered.length && hovered.index() > 0) { - hovered.prev().addClass('hover'); + }); + trigger.on('close.fs', function() { + trigger.removeClass('open'); + return options.removeClass('open'); + }); + trigger.on('click.fs', function() { + var offParent, parent; + if (!disabled) { + trigger.toggleClass('open'); + if (isiOS && !settings.forceiOS) { + if (trigger.hasClass('open')) { + return sel.focus(); + } } else { - options.find('li:last-child').addClass('hover'); + if (trigger.hasClass('open')) { + parent = trigger.parent(); + offParent = parent.offsetParent(); + if ((parent.offset().top + parent.outerHeight() + options.outerHeight() + 20) > $(window).height() + $(window).scrollTop()) { + options.addClass('overflowing'); + } else { + options.removeClass('overflowing'); + } + } + options.toggleClass('open'); + if (!isiOS) { + return sel.focus(); + } + } + } + }); + sel.on('enable', function() { + sel.prop('disabled', false); + wrapper.removeClass('disabled'); + disabled = false; + return copyOptionsToList(); + }); + sel.on('disable', function() { + sel.prop('disabled', true); + wrapper.addClass('disabled'); + return disabled = true; + }); + sel.on('change.fs', function(e) { + if (e.originalEvent && e.originalEvent.isTrusted) { + return e.stopPropagation(); + } else { + return updateTriggerText(); + } + }); + sel.on('keydown', function(e) { + var hovered, newHovered, w; + w = e.which; + hovered = options.find('.hover'); + hovered.removeClass('hover'); + if (!options.hasClass('open')) { + if (w === 13 || w === 32 || w === 38 || w === 40) { + e.preventDefault(); + return trigger.trigger('click.fs'); } - } else if (w === 40) { - e.preventDefault(); - if (hovered.length && hovered.index() < options.find('li').length - 1) { - hovered.next().addClass('hover'); + } else { + if (w === 38) { + e.preventDefault(); + if (hovered.length && hovered.index() > 0) { + hovered.prev().addClass('hover'); + } else { + options.find('li:last-child').addClass('hover'); + } + } else if (w === 40) { + e.preventDefault(); + if (hovered.length && hovered.index() < options.find('li').length - 1) { + hovered.next().addClass('hover'); + } else { + options.find('li:first-child').addClass('hover'); + } + } else if (w === 27) { + e.preventDefault(); + trigger.trigger('click.fs'); + } else if (w === 13) { + e.preventDefault(); + hovered.trigger('mousedown.fs'); + } else if (w === 9) { + if (trigger.hasClass('open')) { + trigger.trigger('close.fs'); + } } else { - options.find('li:first-child').addClass('hover'); + clearTimeout(searchTimeout); + searchTimeout = setTimeout(function() { + searchTerm = ''; + }, 500); + searchTerm += String.fromCharCode(w).toLowerCase(); + optCount = options.find('li').length + 1; + for(var i = 1; i < optCount; i ++) { + var current = options.find('li:nth-child(' + i + ')'); + text = current.text(); + if(text.toLowerCase().indexOf(searchTerm) >= 0) { + current.addClass('hover'); + return; + } + } } - } else if (w === 27) { - e.preventDefault(); - trigger.trigger('click.fs'); - } else if (w === 13 || w === 32) { - e.preventDefault(); - hovered.trigger('mousedown.fs'); - } else if (w === 9) { - if (trigger.hasClass('open')) { - trigger.trigger('close.fs'); + newHovered = options.find('.hover'); + if (newHovered.length) { + options.scrollTop(0); + return options.scrollTop(newHovered.position().top - 12); } } - newHovered = options.find('.hover'); - if (newHovered.length) { - options.scrollTop(0); - return options.scrollTop(newHovered.position().top - 12); + }); + options.on('mousedown.fs', 'li', function(e) { + var clicked; + clicked = $(this); + sel.val(clicked.data('raw-value')); + if (!isiOS) { + sel.trigger('blur.fs').trigger('focus.fs'); } - } - }); - options.on('mousedown.fs', 'li', function(e) { - var clicked; - clicked = $(this); - sel.val(clicked.data('raw-value')); - if (!isiOS) { - sel.trigger('blur.fs').trigger('focus.fs'); - } - options.find('.selected').removeClass('selected'); - clicked.addClass('selected'); - trigger.toggleClass('selected', clicked.data('raw-value') !== ''); - return sel.val(clicked.data('raw-value')).trigger('change.fs').trigger('blur.fs').trigger('focus.fs'); - }); - options.on('mouseenter.fs', 'li', function() { - var hovered, nowHovered; - nowHovered = $(this); - hovered = options.find('.hover'); - hovered.removeClass('hover'); - return nowHovered.addClass('hover'); - }); - options.on('mouseleave.fs', 'li', function() { - return options.find('.hover').removeClass('hover'); - }); - copyOptionsToList = function() { - var selOpts; - updateTriggerText(); - if (isiOS && !settings.forceiOS) { - return; - } - selOpts = sel.find('option'); - return sel.find('option').each(function(i, opt) { - var optHtml; - opt = $(opt); - if (!opt.prop('disabled') && (opt.val() || settings.includeBlank)) { - optHtml = settings.optionTemplate(opt); - if (opt.prop('selected')) { - return options.append("
            • " + optHtml + "
            • "); - } else { - return options.append("
            • " + optHtml + "
            • "); - } + options.find('.selected').removeClass('selected'); + clicked.addClass('selected'); + trigger.toggleClass('selected', clicked.data('raw-value') !== ''); + return sel.val(clicked.data('raw-value')).trigger('change.fs').trigger('blur.fs').trigger('focus.fs'); + }); + options.on('mouseenter.fs', 'li', function() { + var hovered, nowHovered; + nowHovered = $(this); + hovered = options.find('.hover'); + hovered.removeClass('hover'); + return nowHovered.addClass('hover'); + }); + options.on('mouseleave.fs', 'li', function() { + return options.find('.hover').removeClass('hover'); + }); + copyOptionsToList = function() { + var selOpts; + updateTriggerText(); + if (isiOS && !settings.forceiOS) { + return; } + selOpts = sel.find('option'); + return sel.find('option').each(function(i, opt) { + var optHtml; + opt = $(opt); + if (!opt.prop('disabled') && (opt.val() || settings.includeBlank)) { + optHtml = settings.optionTemplate(opt); + if (opt.prop('selected')) { + return options.append("
            • " + optHtml + "
            • "); + } else { + return options.append("
            • " + optHtml + "
            • "); + } + } + }); + }; + sel.on('update.fs', function() { + wrapper.find('.options').empty(); + return copyOptionsToList(); }); - }; - sel.on('update.fs', function() { - wrapper.find('.options').empty(); return copyOptionsToList(); }); - return copyOptionsToList(); - }); -}; -RunLink \ No newline at end of file + }; +}).call(this); \ No newline at end of file From 04d08178cc7d1da45c1c6ec27ba6e9e7d94712d7 Mon Sep 17 00:00:00 2001 From: dahliacreative Date: Wed, 4 Nov 2015 10:54:50 +0000 Subject: [PATCH 6/7] adding type to select functionality when select is closed but focused --- fancySelect.coffee | 21 ++++++++++++++++++++- fancySelect.js | 17 ++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/fancySelect.coffee b/fancySelect.coffee index acbbb77..ecd33af 100644 --- a/fancySelect.coffee +++ b/fancySelect.coffee @@ -1,4 +1,5 @@ (-> + $ = undefined $ = window.jQuery or window.Zepto or window.$ $.fn.fancySelect = (opts) -> @@ -107,9 +108,25 @@ hovered = options.find('.hover') hovered.removeClass 'hover' if !options.hasClass('open') - if w == 13 or w == 32 or w == 38 or w == 40 + if w == 13 or w == 38 or w == 40 e.preventDefault() return trigger.trigger('click.fs') + else + clearTimeout searchTimeout + searchTimeout = setTimeout((-> + searchTerm = '' + return + ), 500) + searchTerm += String.fromCharCode(w).toLowerCase() + optCount = options.find('li').length + 1 + i = 1 + while i < optCount + current = options.find('li:nth-child(' + i + ')') + text = current.text() + if text.toLowerCase().indexOf(searchTerm) >= 0 + current.trigger 'mousedown.fs' + return + i++ else if w == 38 e.preventDefault() @@ -135,6 +152,8 @@ else clearTimeout searchTimeout searchTimeout = setTimeout((-> + `var current` + `var i` searchTerm = '' return ), 500) diff --git a/fancySelect.js b/fancySelect.js index 070c14c..65b88e7 100644 --- a/fancySelect.js +++ b/fancySelect.js @@ -115,9 +115,24 @@ hovered = options.find('.hover'); hovered.removeClass('hover'); if (!options.hasClass('open')) { - if (w === 13 || w === 32 || w === 38 || w === 40) { + if (w === 13 || w === 38 || w === 40) { e.preventDefault(); return trigger.trigger('click.fs'); + } else { + clearTimeout(searchTimeout); + searchTimeout = setTimeout(function() { + searchTerm = ''; + }, 500); + searchTerm += String.fromCharCode(w).toLowerCase(); + optCount = options.find('li').length + 1; + for(var i = 1; i < optCount; i ++) { + var current = options.find('li:nth-child(' + i + ')'); + text = current.text(); + if(text.toLowerCase().indexOf(searchTerm) >= 0) { + current.trigger('mousedown.fs'); + return; + } + } } } else { if (w === 38) { From c4fc94429a543a4648afb92ee15a01c42807d324 Mon Sep 17 00:00:00 2001 From: Simon Sturgess Date: Wed, 4 Nov 2015 10:58:21 +0000 Subject: [PATCH 7/7] fixing coffee --- fancySelect.coffee | 409 ++++++++++++++++++++++----------------------- 1 file changed, 203 insertions(+), 206 deletions(-) diff --git a/fancySelect.coffee b/fancySelect.coffee index ecd33af..1788755 100644 --- a/fancySelect.coffee +++ b/fancySelect.coffee @@ -1,218 +1,215 @@ -(-> - $ = undefined - $ = window.jQuery or window.Zepto or window.$ +$ = window.jQuery or window.Zepto or window.$ - $.fn.fancySelect = (opts) -> - isiOS = undefined - settings = undefined - if opts == null - opts = {} - settings = $.extend({ - forceiOS: false - includeBlank: false - optionTemplate: (optionEl) -> - optionEl.text() - triggerTemplate: (optionEl) -> - optionEl.text() +$.fn.fancySelect = (opts) -> + isiOS = undefined + settings = undefined + if opts == null + opts = {} + settings = $.extend({ + forceiOS: false + includeBlank: false + optionTemplate: (optionEl) -> + optionEl.text() + triggerTemplate: (optionEl) -> + optionEl.text() - }, opts) - isiOS = ! !navigator.userAgent.match(/iP(hone|od|ad)/i) - @each -> - copyOptionsToList = undefined - disabled = undefined - options = undefined - sel = undefined - trigger = undefined - updateTriggerText = undefined - wrapper = undefined - searchTerm = '' - searchTimeout = undefined - sel = $(this) - if sel.hasClass('fancified') or sel[0].tagName != 'SELECT' - return - sel.addClass 'fancified' - sel.css - width: 1 - height: 1 - display: 'block' - position: 'absolute' - top: 0 - left: 0 - opacity: 0 - sel.wrap '
              ' - wrapper = sel.parent() - if sel.data('class') - wrapper.addClass sel.data('class') - wrapper.append '
              ' - if !(isiOS and !settings.forceiOS) - wrapper.append '
                ' - trigger = wrapper.find('.trigger') - options = wrapper.find('.options') - disabled = sel.prop('disabled') - if disabled - wrapper.addClass 'disabled' + }, opts) + isiOS = ! !navigator.userAgent.match(/iP(hone|od|ad)/i) + @each -> + copyOptionsToList = undefined + disabled = undefined + options = undefined + sel = undefined + trigger = undefined + updateTriggerText = undefined + wrapper = undefined + searchTerm = '' + searchTimeout = undefined + sel = $(this) + if sel.hasClass('fancified') or sel[0].tagName != 'SELECT' + return + sel.addClass 'fancified' + sel.css + width: 1 + height: 1 + display: 'block' + position: 'absolute' + top: 0 + left: 0 + opacity: 0 + sel.wrap '
                ' + wrapper = sel.parent() + if sel.data('class') + wrapper.addClass sel.data('class') + wrapper.append '
                ' + if !(isiOS and !settings.forceiOS) + wrapper.append '
                  ' + trigger = wrapper.find('.trigger') + options = wrapper.find('.options') + disabled = sel.prop('disabled') + if disabled + wrapper.addClass 'disabled' - updateTriggerText = -> - triggerHtml = undefined - triggerHtml = settings.triggerTemplate(sel.find(':selected')) - trigger.html triggerHtml + updateTriggerText = -> + triggerHtml = undefined + triggerHtml = settings.triggerTemplate(sel.find(':selected')) + trigger.html triggerHtml - sel.on 'blur.fs', -> - if trigger.hasClass('open') - return setTimeout((-> - trigger.trigger 'close.fs' - ), 120) - return - trigger.on 'close.fs', -> - trigger.removeClass 'open' - options.removeClass 'open' - trigger.on 'click.fs', -> - offParent = undefined - parent = undefined - if !disabled - trigger.toggleClass 'open' - if isiOS and !settings.forceiOS - if trigger.hasClass('open') - return sel.focus() - else - if trigger.hasClass('open') - parent = trigger.parent() - offParent = parent.offsetParent() - if parent.offset().top + parent.outerHeight() + options.outerHeight() + 20 > $(window).height() + $(window).scrollTop() - options.addClass 'overflowing' - else - options.removeClass 'overflowing' - options.toggleClass 'open' - if !isiOS - return sel.focus() - return - sel.on 'enable', -> - sel.prop 'disabled', false - wrapper.removeClass 'disabled' - disabled = false - copyOptionsToList() - sel.on 'disable', -> - sel.prop 'disabled', true - wrapper.addClass 'disabled' - disabled = true - sel.on 'change.fs', (e) -> - if e.originalEvent and e.originalEvent.isTrusted - e.stopPropagation() - else - updateTriggerText() - sel.on 'keydown', (e) -> - hovered = undefined - newHovered = undefined - w = undefined - w = e.which - hovered = options.find('.hover') - hovered.removeClass 'hover' - if !options.hasClass('open') - if w == 13 or w == 38 or w == 40 - e.preventDefault() - return trigger.trigger('click.fs') - else - clearTimeout searchTimeout - searchTimeout = setTimeout((-> - searchTerm = '' - return - ), 500) - searchTerm += String.fromCharCode(w).toLowerCase() - optCount = options.find('li').length + 1 - i = 1 - while i < optCount - current = options.find('li:nth-child(' + i + ')') - text = current.text() - if text.toLowerCase().indexOf(searchTerm) >= 0 - current.trigger 'mousedown.fs' - return - i++ + sel.on 'blur.fs', -> + if trigger.hasClass('open') + return setTimeout((-> + trigger.trigger 'close.fs' + ), 120) + return + trigger.on 'close.fs', -> + trigger.removeClass 'open' + options.removeClass 'open' + trigger.on 'click.fs', -> + offParent = undefined + parent = undefined + if !disabled + trigger.toggleClass 'open' + if isiOS and !settings.forceiOS + if trigger.hasClass('open') + return sel.focus() else - if w == 38 - e.preventDefault() - if hovered.length and hovered.index() > 0 - hovered.prev().addClass 'hover' + if trigger.hasClass('open') + parent = trigger.parent() + offParent = parent.offsetParent() + if parent.offset().top + parent.outerHeight() + options.outerHeight() + 20 > $(window).height() + $(window).scrollTop() + options.addClass 'overflowing' else - options.find('li:last-child').addClass 'hover' - else if w == 40 - e.preventDefault() - if hovered.length and hovered.index() < options.find('li').length - 1 - hovered.next().addClass 'hover' - else - options.find('li:first-child').addClass 'hover' - else if w == 27 - e.preventDefault() - trigger.trigger 'click.fs' - else if w == 13 - e.preventDefault() - hovered.trigger 'mousedown.fs' - else if w == 9 - if trigger.hasClass('open') - trigger.trigger 'close.fs' + options.removeClass 'overflowing' + options.toggleClass 'open' + if !isiOS + return sel.focus() + return + sel.on 'enable', -> + sel.prop 'disabled', false + wrapper.removeClass 'disabled' + disabled = false + copyOptionsToList() + sel.on 'disable', -> + sel.prop 'disabled', true + wrapper.addClass 'disabled' + disabled = true + sel.on 'change.fs', (e) -> + if e.originalEvent and e.originalEvent.isTrusted + e.stopPropagation() + else + updateTriggerText() + sel.on 'keydown', (e) -> + hovered = undefined + newHovered = undefined + w = undefined + w = e.which + hovered = options.find('.hover') + hovered.removeClass 'hover' + if !options.hasClass('open') + if w == 13 or w == 38 or w == 40 + e.preventDefault() + return trigger.trigger('click.fs') + else + clearTimeout searchTimeout + searchTimeout = setTimeout((-> + searchTerm = '' + return + ), 500) + searchTerm += String.fromCharCode(w).toLowerCase() + optCount = options.find('li').length + 1 + i = 1 + while i < optCount + current = options.find('li:nth-child(' + i + ')') + text = current.text() + if text.toLowerCase().indexOf(searchTerm) >= 0 + current.trigger 'mousedown.fs' + return + i++ + else + if w == 38 + e.preventDefault() + if hovered.length and hovered.index() > 0 + hovered.prev().addClass 'hover' + else + options.find('li:last-child').addClass 'hover' + else if w == 40 + e.preventDefault() + if hovered.length and hovered.index() < options.find('li').length - 1 + hovered.next().addClass 'hover' else - clearTimeout searchTimeout - searchTimeout = setTimeout((-> - `var current` - `var i` - searchTerm = '' + options.find('li:first-child').addClass 'hover' + else if w == 27 + e.preventDefault() + trigger.trigger 'click.fs' + else if w == 13 + e.preventDefault() + hovered.trigger 'mousedown.fs' + else if w == 9 + if trigger.hasClass('open') + trigger.trigger 'close.fs' + else + clearTimeout searchTimeout + searchTimeout = setTimeout((-> + `var current` + `var i` + searchTerm = '' + return + ), 500) + searchTerm += String.fromCharCode(w).toLowerCase() + optCount = options.find('li').length + 1 + i = 1 + while i < optCount + current = options.find('li:nth-child(' + i + ')') + text = current.text() + if text.toLowerCase().indexOf(searchTerm) >= 0 + current.addClass 'hover' return - ), 500) - searchTerm += String.fromCharCode(w).toLowerCase() - optCount = options.find('li').length + 1 - i = 1 - while i < optCount - current = options.find('li:nth-child(' + i + ')') - text = current.text() - if text.toLowerCase().indexOf(searchTerm) >= 0 - current.addClass 'hover' - return - i++ - newHovered = options.find('.hover') - if newHovered.length - options.scrollTop 0 - return options.scrollTop(newHovered.position().top - 12) - return - options.on 'mousedown.fs', 'li', (e) -> - clicked = undefined - clicked = $(this) - sel.val clicked.data('raw-value') - if !isiOS - sel.trigger('blur.fs').trigger 'focus.fs' - options.find('.selected').removeClass 'selected' - clicked.addClass 'selected' - trigger.toggleClass 'selected', clicked.data('raw-value') != '' - sel.val(clicked.data('raw-value')).trigger('change.fs').trigger('blur.fs').trigger 'focus.fs' - options.on 'mouseenter.fs', 'li', -> - hovered = undefined - nowHovered = undefined - nowHovered = $(this) - hovered = options.find('.hover') - hovered.removeClass 'hover' - nowHovered.addClass 'hover' - options.on 'mouseleave.fs', 'li', -> - options.find('.hover').removeClass 'hover' + i++ + newHovered = options.find('.hover') + if newHovered.length + options.scrollTop 0 + return options.scrollTop(newHovered.position().top - 12) + return + options.on 'mousedown.fs', 'li', (e) -> + clicked = undefined + clicked = $(this) + sel.val clicked.data('raw-value') + if !isiOS + sel.trigger('blur.fs').trigger 'focus.fs' + options.find('.selected').removeClass 'selected' + clicked.addClass 'selected' + trigger.toggleClass 'selected', clicked.data('raw-value') != '' + sel.val(clicked.data('raw-value')).trigger('change.fs').trigger('blur.fs').trigger 'focus.fs' + options.on 'mouseenter.fs', 'li', -> + hovered = undefined + nowHovered = undefined + nowHovered = $(this) + hovered = options.find('.hover') + hovered.removeClass 'hover' + nowHovered.addClass 'hover' + options.on 'mouseleave.fs', 'li', -> + options.find('.hover').removeClass 'hover' - copyOptionsToList = -> - selOpts = undefined - updateTriggerText() - if isiOS and !settings.forceiOS - return - selOpts = sel.find('option') - sel.find('option').each (i, opt) -> - optHtml = undefined - opt = $(opt) - if !opt.prop('disabled') and (opt.val() or settings.includeBlank) - optHtml = settings.optionTemplate(opt) - if opt.prop('selected') - return options.append('
                • ' + optHtml + '
                • ') - else - return options.append('
                • ' + optHtml + '
                • ') - return + copyOptionsToList = -> + selOpts = undefined + updateTriggerText() + if isiOS and !settings.forceiOS + return + selOpts = sel.find('option') + sel.find('option').each (i, opt) -> + optHtml = undefined + opt = $(opt) + if !opt.prop('disabled') and (opt.val() or settings.includeBlank) + optHtml = settings.optionTemplate(opt) + if opt.prop('selected') + return options.append('
                • ' + optHtml + '
                • ') + else + return options.append('
                • ' + optHtml + '
                • ') + return - sel.on 'update.fs', -> - wrapper.find('.options').empty() - copyOptionsToList() + sel.on 'update.fs', -> + wrapper.find('.options').empty() copyOptionsToList() + copyOptionsToList() - return -).call this \ No newline at end of file +return