#javascript #jquery #toggle #slidetoggle
#javascript #jquery #переключение #slidetoggle
Вопрос:
У меня возникли некоторые проблемы с тем, чтобы заставить эту страницу работать так, как мне нужно. Я, наконец, добрался до того, что одновременно будет открываться только 1 из 9 разделов, но я не могу переключать открытие и закрытие этих разделов с помощью одной и той же кнопки запуска. Если бы у них также мог быть какой-то переход, например, раздвижное открытие и закрытие, это тоже было бы здорово. Я только изучаю jquery и, наконец, в тот момент, когда я должен просто спросить экспертов.
https://toyotechus.com/expanding-rows / — это страница, на которой я это настроил.
Это код, который я использую. У меня есть первоначальный сценарий, повторенный для всех 9 разделов, и код переключения под всем этим.
<script>
( function( $ ) {
'use strict';
$( document ).ready( function() {
var $trigger = $( '.open-vc-row-auto1' );
var $hiddenRow = $( '.vc-row-auto1' );
if ( $hiddenRow.length ) {
$trigger.click( function() {
$hiddenRow.toggle();
return false;
} );
}
} );
} ( jQuery ) );
</script>
<script>
$(".togglerowlink").on("click", function(e) {
var target = $(this).attr("href");
$(target).slideToggle('slow');
$(".vc-row-auto").not(target).hide();
e.preventDefault();
});
</script>
В идеале этот переключатель открывал бы И закрывал раздел, а не просто открывал его. Также я считаю, что он должен открываться и закрываться между изменениями раздела, но это не так.
Комментарии:
1.
jQuery(document).ready(function($){ ...your logic... });
может использоваться вместо вашего внешнего интерфейса, который превращает jQuery в $
Ответ №1:
Похоже, вы написали отдельные блоки скрипта для открытия и закрытия каждой панели. 9 панелей = 9 блоков скрипта. Этот код открывает и закрывает строки должным образом, но не закрывает все остальные, поэтому у вас может быть открыто 2 или 3 строки одновременно. Это ПЛОХО, потому что вы повторяете код снова и снова и затрудняете его изменение в будущем.
Но тогда вы сделали отличную вещь!! Вы пытались написать ОТДЕЛЬНЫЙ блок скрипта, чтобы закрыть любую панель, которая не должна быть открыта. Это правильная идея, и вы должны применить ее к каждой панели.
Проблемы в первую очередь:
- Эта строка не работает, потому что у вас нет
href
атрибутов в ваших HTML-элементах:var target = $(this).attr("href");
Итакtarget === undefined
, и это ничего не дает. - Вы слишком конкретизируете свои селекторы. Это
var $trigger = $( '.open-vc-row-auto9' );
слишком специфично, чтобы повторно использовать его для всех элементов. Вот почему вам приходится писать это 9 раз.
Решения — для этого потребуется небольшой рефакторинг html, но давайте перечислим наши цели.
- Напишите один фрагмент кода для управления всеми кнопками. Он должен применять обработчик щелчков ко ВСЕМ кнопкам, и когда кнопка нажата, мы должны знать, на какую конкретную панель пытается нацелиться эта кнопка.
- Напишите HTML достаточно общий, чтобы обеспечить достижение цели 1. Мы будем использовать
data-
атрибуты для идентификации кнопок и соответствующих им панелей.
<style>
.panel { display: none; }
</style>
<!-- buttons -->
<button class="btn" data-target="panel-1">Show Panel 1</button>
<button class="btn" data-target="panel-2">Show Panel 2</button>
<button class="btn" data-target="panel-3">Show Panel 3</button>
<!-- panels -->
<div class="panel" data-panel="panel-1"><h1>This is panel 1.</h1></div>
<div class="panel" data-panel="panel-2"><h1>This is panel 2.</h1></div>
<div class="panel" data-panel="panel-3"><h1>This is panel 3.</h1></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(function(){
// select all buttons
// get their target
// if target is open, close it
// if target is closed, open it, and close all others
$('.btn').click(function(e){
e.preventDefault();
var btn = $(e.target);
var target = btn.attr('data-target'); // panel-1, panel-2, etc.
var target_panel = $('[data-panel="' target '"]'); // css attribute selector
var targetIsVisible = target_panel.css('display') === 'block'; // display: block; means it's visible ;)
if (targetIsVisible === true){
target_panel.slideUp(); // show the one we want
} else {
$('.panel').hide(); // hide all panels that may or may not be open
target_panel.slideDown(); // show the one we want
}
});
});
</script>
Вам нужно будет применить концепции к вашему коду, это не идеальное исправление для копирования / вставки. Удачи. Вы получили это!