PageSourceSearch

https://www.alicart.com/assets/plugins/dropdown/jquery.dropdown.js

js alicart.com collected 2026-10-02 06:38:48 UTC 4,674 bytes, 135 lines download raw bytes

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.