diff --git a/index.html b/index.html index 13f5272..f4f2c37 100644 --- a/index.html +++ b/index.html @@ -21,7 +21,7 @@ - + diff --git a/js/jquery.sparkbox-select.js b/js/jquery.sparkbox-select.js index abc6d15..40889b8 100644 --- a/js/jquery.sparkbox-select.js +++ b/js/jquery.sparkbox-select.js @@ -1,130 +1,221 @@ (function($) { - var selectboxCounter = 0; - + $.fn.sbCustomSelect = function(options) { var iOS = (navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i)) || (navigator.userAgent.match(/iPad/i)), android = (navigator.userAgent.match(/Android/i)), - UP = 38, DOWN = 40, SPACE = 32, RETURN = 13, TAB = 9, + LEFT = 37, UP = 38, RIGHT = 39, DOWN = 40, SPACE = 32, RETURN = 13, TAB = 9, ESC = 27, PGUP = 33, PGDOWN = 34, matchString = '', + visibleDropdowns = $(), settings = $.extend({ - appendTo: false + appendTo: false, + pollPosition: false //Polling frequency in microsecounds (500-1000 should be enough), default false disableds polling. Use this option only if your selects position may change while dropdown is opened. }, options); + var scrollToSelected = function($dropdown, recover) { + var $selected = $dropdown.find('li.selected'); + if(!$selected.length) return true; + + //recover scroll position (after fadeOut) + if($dropdown.data('sb-saved-scrollTo') && recover) $dropdown.scrollTop($dropdown.data('sb-saved-scrollTo')); + + //we can't just use $selected.position().top, if the sb-dropdown is positioned static -.- + var scrollTop = $dropdown.scrollTop(), + offset = ($selected.offset().top+scrollTop-$dropdown.offset().top); + + if(offset < scrollTop) { + $dropdown.scrollTop(offset); + } else if($dropdown.innerHeight()+scrollTop < offset+$selected.outerHeight()) { + var scrollTo = offset+$selected.outerHeight()-$dropdown.innerHeight(); + $dropdown.scrollTop(scrollTo); + } + $dropdown.data('sb-saved-scrollTo', $dropdown.scrollTop()); + } + + var fixDropdownPositions = function(element) { + if (settings.appendTo) { + var $elements = $(element).is('.sb-dropdown') ? $(element) : visibleDropdowns; + + $elements.each(function() { + var $sbCustom = $(this).data('sb-custom'), + offset = $sbCustom.offset(); + + $(this).css({ + 'top': offset.top, + 'left': offset.left, + 'width': $sbCustom.width() * 0.8 + }); + }); + } + } + // Sync custom display with original select box and set selected class and the correct
  • - var updateSelect = function() { - var $this = $(this), - $dropdown = $('.sb-dropdown[data-id=' + $this.parent().data('id') + ']'), - $sbSelect = $this.siblings('.sb-select'); - - if (this.selectedIndex != -1) { - $sbSelect.val(this[this.selectedIndex].innerHTML); - - $dropdown.children().removeClass('selected') - .filter(':contains(' + this[this.selectedIndex].innerHTML + ')').addClass('selected'); + var updateSelect = function(select) { + var $select = this === window ? $(select) : $(this), + $dropdown = $select.parent().data('sb-dropdown'), + $sbSelect = $select.siblings('.sb-select'); + + if ($select.prop("selectedIndex") != -1) { + $sbSelect.val($select.children().eq($select.prop("selectedIndex")).html()); + + if($dropdown) { + $dropdown.children('.selected').removeClass('selected'); + $dropdown.children().eq($select.prop("selectedIndex")).addClass('selected'); + scrollToSelected($dropdown); + } } }; - + // Update original select box, hide