Jquery events for closing and opening select drop down , and not on change

后端 未结 1 1364
無奈伤痛
無奈伤痛 2020-12-12 01:55

i want a neat solution to handle event for a drop down menu , so that when user opens the select menu , it alerts opened , and when he closes it , it alerts closed , neglect

相关标签:
1条回答
  • 2020-12-12 02:39

    the typical approach to extending the native functionality of a select box is to replace it with styleable markup and then tie the values of the new markup back into the origninal (now hidden) select element. (NOTE: I've not included any styles. This is a bare-bones example of using a select replacement).

    var SelectBox = {
    init: function () {
        if ($('select').length > 0) {
            this.generateStyledSelectbox('custom-select');
        };
    },
    
    generateStyledSelectbox: function (cssClass) {
    
        // Contained within .each to isolate all instances of <select>
        $('select').each(function(index) {
            var $source = $(this),
                selected = $source.find("option[selected]"),
                options = $source.find('option'),
                selindex = index;
    
            // Append styleable pseudo-select element to doc
            $source.after('<div id="result-' + index + '" class="' + cssClass + '"></div>');
    
            // Construct select list in pseudo select element
            $('#result-' + index).append('<dl id="activeValue-' + index + '" class="dropdown"></dl>');
            $('#activeValue-' + index).append('<dt><a href="#">' + selected.text() + '<span class="value">' + selected.val() + '</span></a></dt>');
            $('#activeValue-' + index).append('<dd><ul></ul></dd>');
    
            // Assign select values to pseudo-select lis items
            options.each(function () {
                $('#activeValue-'+ index + ' dd ul').append('<li class="select-menu-item"><a href="#">' + $(this).text() + '<span class="value">' + $(this).val() + '</span></a></li>');
            });
    
            $('.dropdown').each(function(index) {
                $(this).find('dd ul li a').on('click', function(event) {
                    event.preventDefault();
                    var text = $(this).not('.value').html(),
                        $base = $('.custom-selectbox').eq(index);
    
                    $('.dropdown').eq(index).find('dt a').html(text);
                    $('.dropdown').eq(index).find('dd ul').hide();
    
                    $base.val($(this).find('span.value').html());
                });
            });
    
            // prevent link actions in dropdown
            $('.dropdown dt a').on('click', function (event) {
                event.preventDefault();
            });
    
            // open/close
            $(".dropdown").eq(index).find('dt a').on('click', function () {
                $(".dropdown").eq(index).find('dd ul').toggle();
            });
    
            $(".dropdown").eq(index).find('dd ul li a').on('click', function () {
                var text = $(this).html(),
                    newval = $(this).find('.value').html();
    
                $(".dropdown").eq(index).find('dt a span').html(text);
                $('select').eq(index).val(newval);
                $(".dropdown").eq(index).find('dd ul').hide();
            });
    
            // Hide dropdown on outside click
            $(document).on('click', function (e) {
                var $clicked = $(e.target);
                if (!$clicked.parents().hasClass("dropdown")) {
                    $(".dropdown").eq(index).find('dd ul').hide();
                }
                // remove dropdown-open targetable class
                if (!$clicked.parents().hasClass("dropdown-open")) {
                    $clicked.parents().removeClass('dropdown-open');
                }
            });
    
            // Hide native select
            $source.css('display', 'none');
    
            // assign initial (default) value
            var initialval = $source.find('option').eq(0).html();
            $('#activeValue-'+index+' dt a').html(initialval);
    
        }); // END .each
    }
    };
    SelectBox.init();
    

    Here's a fiddle http://jsfiddle.net/P6ZCn/ (again, without styles)

    0 讨论(0)
提交回复
热议问题