Как создать этот аккордеон с несколькими динамическими идентификаторами и кнопкой закрытия?

Я хочу создать аккордеон. Когда я нажимаю «Показать», я хочу, чтобы текст «Показать» был скрыт, а отображались содержимое и кнопка «закрыть». Когда я нажимаю «закрыть», я хочу скрыть содержимое и кнопку «закрыть» и показать кнопку «Показать».

Каждый текст должен быть в HTML, а не в JS. Но я подключаю это к сообщениям с динамическими идентификаторами Wordpress, чтобы отображать и скрывать больше контента на странице индекса.

Это моя попытка, но кнопка «Закрыть» не работает.

Это должно работать с несколькими элементами идентификатора, потому что я подключаю это к странице сообщений индекса Wordpress.

Могу ли я добавить, чтобы изменить класс для этих кнопок «показать / закрыть»? Я хочу, чтобы если я нажму родительский элемент кнопки «Показать», другой элемент изменит класс, а если я нажму родительский элемент кнопки «Закрыть», другой элемент изменит класс?

var $contents = $('.tab-content');
$contents.slice().hide();
$('.tab').click(function() {
  var $target = $('#' + this.id + 'show').show();
  $contents.not($target).hide();
});
.tab {
  background: red;
  max-width: 100px;
  cursor: pointer;
}

.close {
  border: 1px solid red;
  max-width: 100px;
  cursor: pointer;
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id = "tab1" class = "tab">Show 1</div>
<div id = "tab1show" class = "tab-content">
  content 1
  <div class = "close">close</div>
</div>

<br><br><br>
<div id = "tab2" class = "tab">Show 2</div>
<div id = "tab2show" class = "tab-content">
  content 2
  <div class = "close">close</div>
</div>

У вас нет обработчика кликов для кнопки закрытия. $('.close').click(...

Majid Akbari 09.08.2018 17:11

Вы можете добавить обработчик для этой скрипки?

obiboke 09.08.2018 17:13

вы просто просите других людей сделать ту работу, которую вы, очевидно, можете сделать

mathmaniac88 09.08.2018 17:17
Поведение ключевого слова "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) для оценки ваших знаний,...
1
3
86
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Для этого добавьте событие на .close.

var $contents = $('.tab-content');
$contents.slice().hide();

$('.tab').click(function() {
  var $target = $('#' + this.id + 'show').show();
  $(this).hide();
});

$('.close').click(function(){
  $(this).parent().hide();
  let parentId = $(this).parent().attr('id');
  parentId = parentId.replace('show','');
  
  $('#'+parentId).show();
  
});
.tab {background:red; max-width:100px; cursor: pointer;}
.close {border: 1px solid red; max-width:100px; cursor: pointer;}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  
  <div id = "tab1" class = "tab">Show 1</div>
  <div id = "tab1show" class = "tab-content">
  content 1
  <div class = "close">close</div>
  </div>



<br><br><br>
<div id = "tab2" class = "tab">Show 2</div>
<div id = "tab2show" class = "tab-content">
  content 2
  <div class = "close">close</div>
</div>

<br><br><br>

не работают. Когда я нажимаю Показать 2, шоу 1 исчезает.

obiboke 09.08.2018 17:17

Я обновил фрагмент, попробуйте сейчас.

Simranjit Singh 09.08.2018 17:25

хорошо, спасибо, но когда я нажимаю кнопку show1 из post1, я хочу добавить класс в post1 динамически с именем .long и динамически добавить .long в post2, когда я нажимаю show2 jsfiddle.net/udr01vsq/32

obiboke 09.08.2018 17:27
Ответ принят как подходящий

Рабочая рабочий пример.

Вы также должны добавить событие щелчка для кнопки close, например:

var $contents = $('.tab-content');
$contents.slice().hide();

$('.tab').click(function() {
  removeNewClass();

  var $target = $('#' + this.id + 'show').show();
  var newClass = 'post' + this.id.split('tab')[1] + 'long';

  $(this).hide().parent().addClass(newClass);
  $('.tab').show();
  $contents.not($target).hide();
});

$('.close').click(function() {
  removeNewClass();

  $(this).parent().hide();
  $(this).parent().prev('.tab').show();

  var $target = $(this).parent();
});

function removeNewClass() {
  $contents.each(function() {
    var id = $(this).attr('id');
    var postClass = 'post' + id.split('tab')[1];

    $(this).parent().attr("class", postClass);
  });
}
.tab {
  background: red;
  max-width: 100px;
  cursor: pointer;
}

.close {
  border: 1px solid red;
  max-width: 100px;
  cursor: pointer;
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class = "post1">
  <div id = "tab1" class = "tab">Show 1</div>
  <div id = "tab1show" class = "tab-content">
    content 1
    <div class = "close">close</div>
  </div>
</div>


<br><br><br>

<div class = "post2">
  <div id = "tab2" class = "tab">Show 2</div>
  <div id = "tab2show" class = "tab-content">
    content 2
    <div class = "close">close</div>
  </div>

  <br><br><br>
</div>

не работают. Когда я нажимаю «Показать 1» и «Показать 2», шоу 1 исчезает.

obiboke 09.08.2018 17:17

Исправлена ​​проверка сейчас, пожалуйста

Zakaria Acharki 09.08.2018 17:18

хорошо, спасибо, но когда я нажимаю кнопку show1 из post1, я хочу добавить класс в post1 динамически с именем post1long и динамически добавить post2long в post2, когда я нажимаю show2 jsfiddle.net/udr01vsq/25

obiboke 09.08.2018 17:24

Проверьте это обновление jsfiddle.net/z_acharki/udr01vsq/36, вы хотите удалить их, когда мы нажимаем закрыть?

Zakaria Acharki 09.08.2018 17:30

Поехали, проверьте это обновление jsfiddle.net/z_acharki/udr01vsq/55

Zakaria Acharki 09.08.2018 17:48

Хорошо, но когда я нажимаю show1 или show2, красный div с текстом show1 или show2 не скрывает jsfiddle.net/udr01vsq/61

obiboke 09.08.2018 18:18

Попробуй это:

var $contents = $('.tab-content');
$contents.slice().hide();
$('.tab').click(function() {
  var $target = $('#' + this.id + 'show').show().addClass('long');
  $('.tab').show();
  $contents.not($target).hide().removeClass('long');
  $(this).hide();
});

$('.close').click(function() {
  var tab = $('#' + $(this).attr('data-tab'));
  var tabContent = $(this).parent();
  
  tab.show();  
  tabContent.hide();
});
.tab {background:red; max-width:100px; cursor: pointer;}
.close {border: 1px solid red; max-width:100px; cursor: pointer;}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id = "tab1" class = "tab">Show 1</div>
<div id = "tab1show" class = "tab-content">
  content 1
  <div class = "close" data-tab = "tab1">close</div>
  </div>



<br><br><br>
<div id = "tab2" class = "tab">Show 2</div>
<div id = "tab2show" class = "tab-content">
  content 2
  <div class = "close" data-tab = "tab2">close</div>
</div>

<br><br><br>

не работает. Если я нажму "Показать 1" и "Показать 2" покажу 1, будет скрыто.

obiboke 09.08.2018 17:19

хорошо, спасибо, но когда я нажимаю кнопку show1 из post1, я хочу добавить класс в post1 динамически с именем post1long и динамически добавить post2long в post2, когда я нажимаю show2 jsfiddle.net/udr01vsq/25

obiboke 09.08.2018 17:27

Просто используйте событие закрытия, например,

$('.close').on('click',function(){
   $(this).closest('.tab-content').hide();
});

Фрагмент,

var $contents = $('.tab-content');
$contents.slice().hide();
$('.tab').click(function() {
  var $target = $('#' + this.id + 'show').show();
  post = $target.closest('.post');
  post.addClass(post.attr('data-classes') + 'long');
  $allTargets = $contents.not($target);
  $allTargets.each(function() {
    post = $(this).closest('.post');
    post.removeClass(post.attr('data-classes') + 'long');
    $(this).hide();
  });
});
$('.close').on('click', function() {
  $(this).closest('.tab-content').hide();
});
.tab {
  background: red;
  max-width: 100px;
  cursor: pointer;
}

.close {
  border: 1px solid red;
  max-width: 100px;
  cursor: pointer;
}

[class$='long'] .tab {
  color: #FFF;
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "post1 post" data-classes='post1'>

  <div id = "tab1" class = "tab">Show 1</div>
  <div id = "tab1show" class = "tab-content">
    content 1
    <div class = "close">close</div>
  </div>
</div>

<br><br><br>
<div class = "post2 post" data-classes='post2'>
  <div id = "tab2" class = "tab">Show 2</div>
  <div id = "tab2show" class = "tab-content">
    content 2
    <div class = "close">close</div>
  </div>
</div>
<br><br><br>

хорошо, спасибо, но когда я нажимаю кнопку show1 из post1, я хочу добавить класс в post1 динамически с именем .long и динамически добавить .long в post2, когда я нажимаю show2 jsfiddle.net/udr01vsq/32

obiboke 09.08.2018 17:27

Я обновил свой фрагмент в соответствии с вашим комментарием. [Кстати, это еще один вопрос, который нужно задать SO.]

Rohan Kumar 09.08.2018 17:35

когда я нажимаю закрыть класс, он не удаляется из этого, а текст Show1 все еще белый. Вы можете это исправить? Спасибо!

obiboke 09.08.2018 20:50

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