1/* 2 * jQuery Dropdown: A simple dropdown plugin 3 * 4 * Contribute: https://github.com/claviska/jquery-dropdown 5 * 6 * @license: MIT license: http://opensource.org/licenses/MIT 7 * 8 */ 9if (jQuery) (function ($) { 10 11 $.extend($.fn, { 12 jqDropdown: function (method, data) { 13 14 switch (method) { 15 case 'show': 16 show(null, $(this)); 17 return $(this); 18 case 'hide': 19 hide(); 20 return $(this); 21 case 'attach': 22 return $(this).attr('data-jq-dropdown', data); 23 case 'detach': 24 hide(); 25 return $(this).removeAttr('data-jq-dropdown'); 26 case 'disable': 27 return $(this).addClass('jq-dropdown-disabled'); 28 case 'enable': 29 hide(); 30 return $(this).removeClass('jq-dropdown-disabled'); 31 } 32 33 } 34 }); 35 36 function show(event, object) { 37 38 var trigger = event ? $(this) : object, 39 jqDropdown = $(trigger.attr('data-jq-dropdown')), 40 isOpen = trigger.hasClass('jq-dropdown-open'); 41 42 // In some cases we don't want to show it 43 if (event) { 44 if ($(event.target).hasClass('jq-dropdown-ignore')) return; 45 46 event.preventDefault(); 47 event.stopPropagation(); 48 } else { 49 if (trigger !== object.target && $(object.target).hasClass('jq-dropdown-ignore')) return; 50 } 51 hide(); 52 53 if (isOpen || trigger.hasClass('jq-dropdown-disabled')) return; 54 55 // Show it 56 trigger.addClass('jq-dropdown-open'); 57 jqDropdown 58 .data('jq-dropdown-trigger', trigger) 59 .show(); 60 61 // Position it 62 position(); 63 64 // Trigger the show callback 65 jqDropdown 66 .trigger('show', { 67 jqDropdown: jqDropdown, 68 trigger: trigger 69 }); 70 71 } 72 73 function hide(event) { 74 75 // In some cases we don't hide them 76 var targetGroup = event ? $(event.target).parents().addBack() : null; 77 78 // Are we clicking anywhere in a jq-dropdown? 79 if (targetGroup && targetGroup.is('.jq-dropdown')) { 80 // Is it a jq-dropdown menu? 81 if (targetGroup.is('.jq-dropdown-menu')) { 82 // Did we click on an option? If so close it. 83 if (!targetGroup.is('A')) return; 84 } else { 85 // Nope, it's a panel. Leave it open. 86 return; 87 } 88 } 89 90 // Hide any jq-dropdown that may be showing 91 $(document).find('.jq-dropdown:visible').each(function () { 92 var jqDropdown = $(this); 93 jqDropdown 94 .hide() 95 .removeData('jq-dropdown-trigger') 96 .trigger('hide', { jqDropdown: jqDropdown }); 97 }); 98 99 // Remove all jq-dropdown-open classes 100 $(document).find('.jq-dropdown-open').removeClass('jq-dropdown-open'); 101 102 } 103 104 function position() { 105 106 var jqDropdown = $('.jq-dropdown:visible').eq(0), 107 trigger = jqDropdown.data('jq-dropdown-trigger'), 108 hOffset = trigger ? parseInt(trigger.attr('data-horizontal-offset') || 0, 10) : null, 109 vOffset = trigger ? parseInt(trigger.attr('data-vertical-offset') || 0, 10) : null; 110 111 if (jqDropdown.length === 0 || !trigger) return; 112 113 // Position the jq-dropdown relative-to-parent... 114 if (jqDropdown.hasClass('jq-dropdown-relative')) { 115 jqDropdown.css({ 116 left: jqDropdown.hasClass('jq-dropdown-anchor-right') ? 117 trigger.position().left - (jqDropdown.outerWidth(true) - trigger.outerWidth(true)) - parseInt(trigger.css('margin-right'), 10) + hOffset : 118 trigger.position().left + parseInt(trigger.css('margin-left'), 10) + hOffset, 119 top: trigger.position().top + trigger.outerHeight(true) - parseInt(trigger.css('margin-top'), 10) + vOffset 120 }); 121 } else { 122 // ...or relative to document 123 jqDropdown.css({ 124 left: jqDropdown.hasClass('jq-dropdown-anchor-right') ? 125 trigger.offset().left - (jqDropdown.outerWidth() - trigger.outerWidth()) + hOffset : trigger.offset().left + hOffset, 126 top: trigger.offset().top + trigger.outerHeight() + vOffset 127 }); 128 } 129 } 130
131 $(document).on('click.jq-dropdown', '[data-jq-dropdown]', show); 132 $(document).on('click.jq-dropdown', hide); 133 $(window).on('resize', position); 134 135})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.