Показать / скрыть на основе раскрывающегося списка

Я использую JQuery для отображения / скрытия div в зависимости от того, что пользователь выбирает в раскрывающемся списке.

Мой HTML:

<select>
   <option value='test'>Test</option>
   <option value='example'>Example</option>
   <option value='blah'>Blah</option>
</select>
<div data-show = "blah">Should be shown when blah</div>
<div data-hide = "example">Should be hidden when example</div>

Мой JQuery (в coffeescript):

$("select").on "change", () ->
  shows = $('[data-show = "' + $(this).val() + '"]')
  hides = $('[data-hides = "' + $(this).val() + '"]')

  shows.show()
  hides.hides()

Это работает, когда пользователь выбирает правильный вариант, скажем, Пример. Но когда пользователь возвращается к Контрольная работа, он должен вернуться к значению по умолчанию. Как мне заставить это работать?

Не могли бы вы предоставить больше информации о желаемом результате? Вы хотите скрыть все элементы по отдельности и показывать только после того, как был сделан правильный выбор? И показывать некоторые по умолчанию и скрывать только при определенном выделении?

SirPilan 15.07.2018 20:39

@ Пилан. Я хочу, чтобы элементы с data-hide были видны по умолчанию. Когда пользователь выбирает вариант выбора, соответствующий data-hide, элемент должен скрываться. В противном случае элемент должен отображаться.

NathanB 15.07.2018 20:46

@Pilan, а для data-show должно быть наоборот

NathanB 15.07.2018 20:47
понятно, думаю: D
SirPilan 15.07.2018 20:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
876
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Создайте набор элементов, которые вы хотите показать / скрыть:

var elements = $('[data-show], [data-hide]');

Затем вы можете использовать функцию jQuery .filter, чтобы показать только выбранный элемент:

var elements = $('[data-show], [data-hide]');    

function showElement(option) {  
  var filter;  
  
  // hide all elements befor filtering
  elements.hide();
  
  // create the filter value, which will be used for filtering
  switch (option) {
    case 'test':
      filter = '[data-hide = "example"]';
      console.info('show only example');
      break;
    
    case 'blah':
      filter = '*';
      console.info('show all elements');
      break;
      
    default:
      console.info('hide all elements (including example)');
      break;
  }  
  
  if (filter) {
    elements.filter(filter).show(); 
  }
}

showElement('test');

$("select").on("change", function() {
  showElement($(this).val());  
})
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select>
  <option value='test'>Test</option>
  <option value='example'>Example</option>
  <option value='blah'>Blah</option>
</select>
<div data-show = "blah">Should be shown when blah</div>
<div data-hide = "example">Should be hidden when example</div>

Также у вас было несколько опечатки:

  • Когда вы выбираете элемент через data-hide, появляется дополнительный s (hides):

    hides = $('[data-hides = "' + $(this).val() + '"]')
    
  • Если вы хотите скрыть hides с помощью вызова .hides(), jQuery имеет только функцию .hide(), чтобы скрыть элемент:

    hides.hides()
    
Ответ принят как подходящий

Можно использовать filter() для настройки окончательного отображения и сделать обратное для всей группы перед фильтром.

$("select").on("change", function(){
  var value = this.value
  // hide all data-show
  $('[data-show]').hide().filter(function(){
     return $(this).data('show') === value;
  }).show()// only show matching ones
  
 $('[data-hide]').show().filter(function(){
     return $(this).data('hide') === value;
  }).hide()

}).change()
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select>
   <option value='test'>Test</option>
   <option value='example'>Example</option>
   <option value='blah'>Blah</option>
</select>
<div data-show = "blah">Should be shown when blah</div>
<div data-hide = "example">Should be hidden when example</div>

Привет @charlieftl, по умолчанию все элементы должны скрываться, при изменении, относящемся к элементу данных, отображается только, тест не имеет значения данных

Krishna Jonnalagadda 15.07.2018 20:28

Если это так, то действительно ли вам нужны и data-show, и data-hide? Разве одного не хватит?

charlietfl 15.07.2018 20:29

NathanB ожидает, что если пользователь протестирует, все должно скрываться

Krishna Jonnalagadda 15.07.2018 20:33

@charlietfl, Спасибо, это желаемый результат. Один вопрос: если бы у меня было несколько выборок на странице, каждый из которых был бы заключен в: <div class='select-picker'>, какой был бы самый простой способ просто фильтровать элементы для каждого .select-picker?

NathanB 15.07.2018 20:54

Попробуйте $(this).closest('.select-picker').find('[data-show]').hide()‌​.filter(function(){.‌​..

charlietfl 15.07.2018 20:57

@charlietfl, спасибо! Я очень ценю помощь!

NathanB 15.07.2018 21:03

Я не знаю, чем вы занимаетесь, но это описанное поведение, вероятно, не желаемое: D

$('select').on('change', (e) => {
  // apply defaults, then filter // credits to filter @charlietfl
  $('[data-show]').hide().filter('[data-show=' + $(e.target).val() + ']').show();
  $('[data-hide]').show().filter('[data-hide=' + $(e.target).val() + ']').hide();
}).change();
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select>
   <option value='test'>Test</option>
   <option value='example'>Example</option>
   <option value='blah'>Blah</option>
</select>
<div data-show = "blah">Should be shown when blah</div>
<div data-hide = "example">Should be hidden when example</div>

РЕДАКТИРОВАТЬ добавлено скрытие / отображение по умолчанию

Почему это должно работать по-другому? e.target и this одинаковы

charlietfl 15.07.2018 20:27

нет, this - это window - попробуйте console.info(this) - если вы сделаете function() {...}, this станет select

SirPilan 15.07.2018 20:29

OP использует кофейный скрипт, а не функцию стрелки. Это верно только для стрелочной функции

charlietfl 15.07.2018 20:30

конечно, но не меняет поведения

charlietfl 15.07.2018 20:32

но исправления, которые я сделал - например, data-hide вместо data-hides - просто хотел предоставить рабочий пример, который он может использовать в качестве основы

SirPilan 15.07.2018 20:34
<select class = "selectBoxClass">
    <option value='test'>Test</option>
    <option value='example'>Example</option>
    <option value='blah'>Blah</option>
</select>
<div data-show = "blah" class = "all ">Should be shown when blah</div>
<div data-hide = "example" class = "all">Should be hidden when example</div>

<script>
    $(document).on('change', '.selectBoxClass', function(event) {
        event.preventDefault();
        $('div.all').show();
        shows = $('[data-show = "' + $(this).val() + '"]')
        hides = $('[data-hides = "' + $(this).val() + '"]')
        shows.show()
        hides.hides()
    });

</script>

** если ваш предыдущий код не работает должным образом, вы можете попробовать это.

$(function(){
            $('div').hide();
            $('select').change(function(){
                if ($(this).val()=='blah'){
                  $('div[data-show]').show();
                  $('div[data-hide]').hide();

                }else if ($(this).val()=='example'){
                  $('div[data-hide]').show();
                  $('div[data-show]').hide();
                }else{
                  $('div[data-hide]').hide();
                  $('div[data-show]').hide();
                }
            })
        })   
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
 <select>
   <option value='test'>Test</option>
   <option value='example'>Example</option>
   <option value='blah'>Blah</option>
</select>
<div data-show = "blah">Should be shown when blah</div>
<div data-hide = "example">Should be hidden when example</div>

Предположим, вы предполагаете набор div, некоторые из которых вы хотите показать / скрыть в зависимости от того, что вы выбрали в раскрывающемся списке в jQuery.

Вот как этого можно достичь.

Сетки

<div class = "row exhbitors-grid-row">
                            
    <div class = "col-lg-6 col-md-6 exhibitor-grid-item" style = "">
        <div class = "exhibitor-grid-large wow pixFadeRight" data-wow-delay = "0.5s" style = "visibility: visible; animation-delay: 0.5s; animation-name: pixFadeRight;">
            <div class = "member-avater">
                <img src = "#" alt = "">
            </div>
            <div class = "listing-page-exhibitor-brief wow pixFadeUp" style = "visibility: visible; animation-name: pixFadeUp;">
                <div class = "exhibitor-details">
                    <input type = "hidden" name = "industry" class = "industry Accommodation" value = "Accommodation">
                    <h4 class = "grid-exhibitor-title">Tourist Board</h4>
                    <strong class = "grid-exhibitor-copy">Manning the Booth</strong>
                    <div class = "grid-item-host">
                        <span>User</span>
                        <a href = "bcard.pdf" target = "_blank" title = "Download business card"><i class = "fa fa-address-card b-card-file" aria-hidden = "true"></i>
                        </a> 
                    </div>
                </div>
            </div>
        </div>
    </div>
                
    <div class = "col-lg-6 col-md-6 exhibitor-grid-item" style = "">
        <div class = "exhibitor-grid-large wow pixFadeRight" data-wow-delay = "0.5s" style = "visibility: visible; animation-delay: 0.5s; animation-name: pixFadeRight;">
            <div class = "member-avater">
                <img src = "#" alt = "">
            </div>
            <div class = "listing-page-exhibitor-brief wow pixFadeUp" style = "visibility: visible; animation-name: pixFadeUp;">
                <div class = "exhibitor-details">
                    <input type = "hidden" name = "industry" class = "industry Airline" value = "Airline">
                    <h4 class = "grid-exhibitor-title">Tourist Board</h4>
                    <strong class = "grid-exhibitor-copy">Manning the Booth</strong>
                    <div class = "grid-item-host">
                        <span>User</span>
                        <a href = "bcard.pdf" target = "_blank" title = "Download business card"><i class = "fa fa-address-card b-card-file" aria-hidden = "true"></i>
                        </a> 
                    </div>
                </div>
            </div>
        </div>
    </div>
    ...
    ...
    ...
    
</div>

Где-то на странице у вас есть выпадающий список, который выглядит следующим образом:

<select class = "category-select" name = "category-select" id = "category-select">
    <option value = "-1">Industry </option>
    <option value = "1">Accommodation</option>
    <option value = "2">Airline</option>
    <option value = "3">Car Rentals</option>
    <option value = "4">City Tourist Board</option>
    ...
    ...
    ...
</select>

При изменении этого раскрывающегося списка мы хотим отображать только тот div, значение значения скрытого поля которого совпадает с выбранным элементом раскрывающегося списка. Проверьте значения скрытых полей выше в div.

Нам понадобится немного jQuery, чтобы творить чудеса. Вот как это будет выглядеть:

$(document).ready(function(){
if ($(".category-select")){
$(".category-select").change(function(){
    $(".exhibitor-grid-item").show();
    var selectedIndustry = $(".category-select option:selected").text();
    $(".exhibitor-grid-item").each(function(){
        var $itemIndustry = $(this).find(".industry").val();
        if ($(".category-select option:selected").val() > -1){
          if (selectedIndustry != $itemIndustry){
            $(this).find(".industry").parent().parent().parent().parent().hide();
          }
        }
     });
   });
 }
});

Другие вопросы по теме