4

我正在尝试使用 a<select>以便在更改时隐藏/显示一个 div。

我想使用 twitter bootstrap collapse 插件。

我用这个例子做了一半http://plnkr.co/edit/9lPe61?p=preview

但是,当您添加selected到选择时,它会破坏一切:http ://plnkr.co/edit/w9XW8R?p=preview

<div class="accordion" id="accordion" >
    <div class="accordion-group">
      <select class="accordion-toggle">
         <option value="1" data-toggle="collapse" data-parent="#accordion" data-target="#collapseOne">1</option>
         <option value="2" data-toggle="collapse" data-parent="#accordion" data-target="#collapseTwo">2</option>
         <option value="3" data-toggle="collapse" data-parent="#accordion" data-target="#collapseThree">3</option>
      </select>

      <div id="collapseOne" class=" collapse in">
        <div class="accordion-inner">
          Anim1 pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
        </div>
      </div>
    </div>
    <div class="accordion-group">
      <div id="collapseTwo" class=" collapse">
        <div class="accordion-inner">
          Anim2 pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
        </div>
      </div>
    </div>
    <div class="accordion-group">
      <div id="collapseThree" class=" collapse">
        <div class="accordion-inner">
          Anim3 pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
        </div>
      </div>
    </div>
</div>

JS - 我想我需要添加到插件中以检查是否有一个selected="selected"以便它也适用于选择,但我无法弄清楚这需要去哪里?

/* =============================================================
 * bootstrap-collapse.js v2.3.1
 * http://twitter.github.com/bootstrap/javascript.html#collapse
 * =============================================================
 * Copyright 2012 Twitter, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============================================================ */


!function ($) {

  "use strict"; // jshint ;_;


 /* COLLAPSE PUBLIC CLASS DEFINITION
  * ================================ */

  var Collapse = function (element, options) {
    this.$element = $(element)
    this.options = $.extend({}, $.fn.collapse.defaults, options)

    if (this.options.parent) {
      this.$parent = $(this.options.parent)
    }

    this.options.toggle && this.toggle()
  }

  Collapse.prototype = {

    constructor: Collapse

  , dimension: function () {
      var hasWidth = this.$element.hasClass('width')
      return hasWidth ? 'width' : 'height'
    }

  , show: function () {
      var dimension
        , scroll
        , actives
        , hasData

      if (this.transitioning || this.$element.hasClass('in')) return

      dimension = this.dimension()
      scroll = $.camelCase(['scroll', dimension].join('-'))
      actives = this.$parent && this.$parent.find('> .accordion-group > .in')

      if (actives && actives.length) {
        hasData = actives.data('collapse')
        if (hasData && hasData.transitioning) return
        actives.collapse('hide')
        hasData || actives.data('collapse', null)
      }

      this.$element[dimension](0)
      this.transition('addClass', $.Event('show'), 'shown')
      $.support.transition && this.$element[dimension](this.$element[0][scroll])
    }

  , hide: function () {
      var dimension
      if (this.transitioning || !this.$element.hasClass('in')) return
      dimension = this.dimension()
      this.reset(this.$element[dimension]())
      this.transition('removeClass', $.Event('hide'), 'hidden')
      this.$element[dimension](0)
    }

  , reset: function (size) {
      var dimension = this.dimension()

      this.$element
        .removeClass('collapse')
        [dimension](size || 'auto')
        [0].offsetWidth

      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')

      return this
    }

  , transition: function (method, startEvent, completeEvent) {
      var that = this
        , complete = function () {
            if (startEvent.type == 'show') that.reset()
            that.transitioning = 0
            that.$element.trigger(completeEvent)
          }

      this.$element.trigger(startEvent)

      if (startEvent.isDefaultPrevented()) return

      this.transitioning = 1

      this.$element[method]('in')

      $.support.transition && this.$element.hasClass('collapse') ?
        this.$element.one($.support.transition.end, complete) :
        complete()
    }

  , toggle: function () {
      this[this.$element.hasClass('in') ? 'hide' : 'show']()
    }

  }


 /* COLLAPSE PLUGIN DEFINITION
  * ========================== */

  var old = $.fn.collapse

  $.fn.collapse = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('collapse')
        , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option)
      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.collapse.defaults = {
    toggle: true
  }

  $.fn.collapse.Constructor = Collapse


 /* COLLAPSE NO CONFLICT
  * ==================== */

  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }


 /* COLLAPSE DATA-API
  * ================= */

  $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
    var $this = $(this), href
      , target = $this.attr('data-target')
        || e.preventDefault()
        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
      , option = $(target).data('collapse') ? 'toggle' : $this.data()
    $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
    $(target).collapse(option)
  })

}(window.jQuery);

http://plnkr.co/edit/w9XW8R?p=preview

4

3 回答 3

4

操作,

I think this http://plnkr.co/edit/qfB8Uf?p=preview is what you're after.


The important bits

JS

...
  $('document').ready(function () {
      $(".accordion-dropdpwn").on('change', function (e) {
          var selected_value = $(this).val(),
          $target_elem = $('a[href="' + selected_value + '"]');
          $target_elem.trigger('click');
      });

      $('.accordion-toggle').on('click', function () {
          var selected_value = $(this).attr('href');
          $(".accordion-dropdown option").removeAttr('selected');
          $('option[value="' + selected_value + '"]').attr('selected', 'selected');
      });

      $(".accordion-dropdown").trigger('change');
  });

...

Brief

Since the change event for the <select> returns the value of the selected option (child), I stuffed a reference to the accordion <a> that should be affected when the user changes the drop-down.

Once we have our reference, we simply trigger a click event on that item. The other important bit is making sure that when the page is loaded, the accordion will reflect the current state of the select — that is, whichever option has selected="selected" will be open/active.

Lastly, there is bi-directional control. Since if the user changes the <select>, the accordion changes, it's expected that clicking the accordion should change the <select>.

Hope this helps.

于 2013-03-13T16:31:05.557 回答
2

首先,我有点懒。我添加了一些 JavaScript、HTML 和 CSS。

在此处查看演示。

有一两个错误。我会尝试修复它们。

于 2013-03-05T19:32:03.410 回答
0

This worked for me (See this jsFiddle for a working example):

HTML

...
<select class="custom-select custom-select--collapse" aria-label="Select option to collapse">
    <option value="" selected data-target=".collapse.show">-- Choose something --</option>
    <option value="Collapse 1" data-target="#collapse1">Collapse 1</option>
    ...
</select>
...

...
<div class="collapse mb-3" id="collapse1">Content Collapse 1</div>
<div class="collapse mb-3" id="collapse2">Content Collapse 2</div>
...

JQUERY

// DEFINE TARGET
var target; 

// SELECT OPTION TO SHOW/HIDE COLLAPSIBLE CONTENT
$('.custom-select--collapse').on('change' , function() {
    
    $('.custom-select--collapse option').each(function() {
      if ( $(this).is(':selected') ) {
        // ASSIGN TARGET
        target = $(this).attr("data-target");
      }
      
      // HIDE ALL CONTENT IF SELECTED OPTION HAS NO VALUE
      if ( $(this).val() == "" ){
        $(target).collapse('hide');
      }else{
        $(target).collapse('toggle');
      }
  });
  
  console.log("TARGET = " + target);        
});
于 2021-10-07T08:55:25.330 回答