Показать/скрыть раскрывающийся список «выбрать» с помощью jQuery в зависимости от значения

Я пытаюсь создать собственный раскрывающийся список, который показывает/скрывает второй набор раскрывающихся списков на основе его выбора.

Мне было интересно, может ли кто-нибудь здесь помочь с решением этой проблемы.

var i = 0;
$(document).ready(function() {
  var bindClickToToggle = function(element) {
    element.click(function() {
      $(this).parents('.dropdown').find('dd ul').toggle();
    });
  };

  var bindClickToUpdateSelect = function(element) {
    element.click(function() {
      var text = element.html();
      var value = element.find('span.value').html();
      var dropdown = element.parents('.dropdown');
      var select = $(dropdown.attr('target'));
      dropdown.children('dt').find('a').html(text);
      dropdown.find('dd ul').hide();
      select.attr('value', value);
    });
  };

  var getItemHtml = function(element) {
    return '<dt><a href="#">' + element.text() + '<span class="value">' + element.attr('value') + '</span></a></dt>';
  };

  var getDropdownHtml = function(id, target) {
    return '<dl id="target' + id + '" class="dropdown" target="#' + target.attr('id') + '"></dl>';
  };

  var getEnclosingHtml = function() {
    return '<dd><ul></ul></dd>';
  };

  var createDropDown = function(element, appendTo) {
    var selected = element.find('option[selected]');
    var options = element.find('option');
    appendTo.append(getDropdownHtml(i, element));
    var target = appendTo.find('#target' + i);
    target.append(getItemHtml(selected));
    target.append(getEnclosingHtml());
    var appendOptionsTo = target.find('ul');
    options.each(function() {
      appendOptionsTo.append(getItemHtml($(this)));
    });
    appendOptionsTo.find('a').each(function() {
      bindClickToUpdateSelect($(this));
    });
    i++;
  };

  $('select').each(function() {
    createDropDown($(this), $('body'));
  });
  $('a').each(function() {
    bindClickToToggle($(this));
    $(this).click(function() {
      $(this).parents('ul').hide();
    });
  });

  $(document).bind('click', function(e) {
    var $clicked = $(e.target);
    if (!$clicked.parents().hasClass("dropdown")) {
      $(".dropdown dd ul").hide();
    }
  });
});
body {
  font-family: Arial, Helvetica, Sans-Serif;
  font-size: 0.75em;
  color: #000;
}

.desc {
  color: #6b6b6b;
}

.desc a {
  color: #0092dd;
}

.dropdown dd,
.dropdown dt,
.dropdown ul {
  margin: 0px;
  padding: 0px;
}

.dropdown dd {
  position: relative;
}

.dropdown a,
.dropdown a:visited {
  color: #816c5b;
  text-decoration: none;
  outline: none;
}

.dropdown a:hover {
  color: #5d4617;
}

.dropdown dt a:hover {
  color: #5d4617;
  border: 1px solid #d0c9af;
}

.dropdown dt a {
  background: #e4dfcb url(arrow.png) no-repeat scroll right center;
  display: block;
  padding-right: 20px;
  border: 1px solid #d4ca9a;
  width: 160px;
  padding: 5px;
}

.dropdown dt a span {
  cursor: pointer;
  display: block;
}

.dropdown dd ul {
  background: #e4dfcb none repeat scroll 0 0;
  border: 1px solid #d4ca9a;
  color: #C5C0B0;
  display: none;
  left: 0px;
  padding: 5px 0px;
  position: absolute;
  top: 2px;
  width: auto;
  min-width: 170px;
  list-style: none;
}

.dropdown span.value {
  display: none;
}

.dropdown dd ul li a {
  padding: 5px;
  display: block;
}

.dropdown dd ul li a:hover {
  background-color: #d0c9af;
}

.dropdown img.flag {
  border: none;
  vertical-align: middle;
  margin-left: 10px;
}

.flagvisibility {
  display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
<p class="desc">The control down here is a dropdown made with CSS and jQuery. It is bound to SELECT element on the page which isn't hidden intentionally.</p>
<div id="log"></div>
<select id="source">
  <option selected="selected" value="BR">Brasil</option>
  <option value="FR">France</option>
  <option value="DE">Germany</option>
  <option value="IN">India</option>
</select>
<select id="source2a">
  <option selected="selected" value="BR">Cities in France</option>
  <option value="FR">France City 1</option>
  <option value="DE">France City 2</option>
  <option value="IN">France City 3</option>
  <option value="JP">France City 4</option>
  <option value="RS">France City 5</option>
  <option value="UK">France City 6</option>
  <option value="US">France City 7</option>
</select>
<select id="source2b">
  <option selected="selected" value="BR">Cities in Germany</option>
  <option value="FR">Germany City 1</option>
  <option value="DE">Germany City 2</option>
  <option value="IN">Germany City 3</option>
  <option value="JP">Germany City 4</option>
  <option value="RS">Germany City 5</option>
  <option value="UK">Germany City 6</option>
  <option value="US">Germany City 7</option>
</select>
<select id="source2c">
  <option selected="selected" value="BR">Cities in India</option>
  <option value="FR">India City 1</option>
  <option value="DE">India City 2</option>
  <option value="IN">India City 3</option>
  <option value="JP">India City 4</option>
  <option value="RS">India City 5</option>
  <option value="UK">India City 6</option>
  <option value="US">India City 7</option>
</select>


person iamchriswick    schedule 26.11.2010    source источник
comment
+1 за то, что нашли время разместить свой код на jsFiddle, а не просто вставить его сюда.   -  person RPM1984    schedule 26.11.2010
comment
Я бы дал +2 за выполнение обоих. Публикация на jsfiddle и здесь. Потому что что произойдет, если jsfiddle однажды облажается, и ссылка больше не будет работать?   -  person Simon Schubert    schedule 04.05.2017


Ответы (1)


используйте jquery :selected немного документации здесь http://api.jquery.com/selected-selector/

Это работает в меню выбора опций

Сейчас я обновляю ваш Jfiddle, если вы можете дать мне немного больше информации о том, что вы хотите сделать.


Изменить

Вот обновленный jfiddle с вашим ответом. http://jsfiddle.net/stAAm/7/

и копия кода для переполнения стека

$('#source').change(function () {
        if ($('#source option:selected').text() == "France"){
            $('.cities').hide();
            $('#source2a').show();
        } else if ($('#source option:selected').text() == "Germany"){
            $('.cities').hide();
            $('#source2b').show();
        } else if ($('#source option:selected').text() == "India"){
            $('.cities').hide();
            $('#source2c').show();
        } else {
            $('.cities').hide();
        } }); 
person austinbv    schedule 26.11.2010
comment
@zobgib: Как видно из кода, элемент управления вниз привязан к элементу SELECT на странице, который не скрыт намеренно. Это должно быть скрыто в конечном коде. Выпадающий список стран (например, Бразилия, Франция, Индия) — единственный, который должен отображаться при первом входе на страницу. Затем, когда в этом раскрывающемся списке сделан выбор (например, одна из стран), появится раскрывающийся список с городами из выбранной страны. - person iamchriswick; 26.11.2010
comment
@zobgib: Отлично, это именно то, что я искал :D Спасибо! Теперь я хотел бы, чтобы это работало с пользовательским раскрывающимся списком. Возможно ли это сделать? - person iamchriswick; 26.11.2010
comment
Мне кажется, что настраиваемый раскрывающийся список работает нормально, или вы хотите, чтобы при нажатии на классическом ‹select› также открывался настраиваемый раскрывающийся список? - person austinbv; 26.11.2010
comment
Что я хочу, так это иметь тот же эффект, когда я нажимаю в пользовательском раскрывающемся списке, что и при использовании классики. Например, наличие раскрывающегося списка, например городов, для отображения при выборе из раскрывающегося списка страны. - person iamchriswick; 28.11.2010