【问题标题】:Jquery events for closing and opening select drop down , and not on change用于关闭和打开选择下拉的 Jquery 事件,而不是更改
【发布时间】:2013-12-02 05:38:51
【问题描述】:

我想要一个简洁的解决方案来处理下拉菜单的事件,这样当用户打开选择菜单时,它会发出警报打开,当他关闭它时,它会发出警报关闭,不管选择的值是否改变。

<select id="dummy">
<option>dummy1</option>
<option>dummy2</option>
<option>dummy3</option>
</select>

我想要的是类似的东西

$("#dummy").on('open',function(){//do something})
$("#dummy").on('close',function(){//do something})

类似堆盒的东西 http://www.bartos.me/heapbox/

这个解决方案是不可接受的:Run change event for select even when same option is reselected

【问题讨论】:

  • 您的示例链接已失效,并且您拼错了“功能”。不如告诉我们您实际尝试过什么?
  • clickblur 应该可以正常工作。
  • 你在说什么死链接? ,我拼错了什么功能?
  • 使用选择插件....有关选择标签的事件很困难,尤其是在 IE 中。您正在走一条其他人多年来一直在走的路……这就是为什么出现对活动更友好的插件的原因。更不用说它们也可以设计样式
  • @ProllyGeek 继续尝试....然后尝试各种浏览器。由你决定……你去过那里

标签: javascript jquery html html-select


【解决方案1】:

扩展选择框的本机功能的典型方法是用可样式标记替换它,然后将新标记的值绑定回原来的(现在隐藏的)选择元素。 (注意:我没有包含任何样式。这是使用选择替换的简单示例)。

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();

这是一个小提琴http://jsfiddle.net/P6ZCn/(同样,没有样式)

【讨论】:

  • 可以试一试吗?
  • 你可以使用虚拟类,我明白了,问题是事件!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
相关资源
最近更新 更多