Мне удалось придумать этот javascript для перехода вниз по div.
Когда вы нажимаете, он перемещает все вверх, а затем сместит тот, который был нажат.
Проблема заключается в том, что при нажатии на один и тот же заголовок, когда он уже открыт, содержимое сканируется, а затем снова возвращается обратно.
Что необходимо для того, чтобы код мог только выполнить резервное копирование, если он уже отображается?
function toggle_visibility(id) {
var thelist = document.getElementsByClassName("alist");
for (var i = 0; i < thelist.length; i++) {
$(thelist[i]).slideUp( "slow", function() {});
}
//break if the DIV was displayed last!
var e = document.getElementById(id);
$( e ).slideDown( "slow", function() {});
}
Вы можете проверить клиентскую ширину элемента, чтобы узнать, видна ли она:
if (document.getElementById(id).clientHeight) return; // already visible
Или, как вы, кажется, используете jQuery:
if ($(e).is(':visible')) return;
Я думаю, что элемент, переданный toggle_visiblity
принадлежит классу alist
. Таким образом, элемент, который вы хотите сдвинуть вниз, сначала будет сместиться во время цикла for
, а затем снова спустится после цикла. Добавьте проверку внутри цикла, чтобы проверить, является ли элемент видимым. Если это так, то только слайд-шоу. Что происходит здесь, так это то, что ваш элемент соскальзывает во время цикла, поскольку он является частью списка, а затем снова сместился после цикла. Внутри цикла вы хотите сместить элементы alist
, которые не имеют id
типа.
function toggle_visibility(id) {
var thelist = document.getElementsByClassName("alist");
for (var i = 0; i < thelist.length; i++) {
$(thelist[i]).slideUp( "slow", function() {});
}
//break if the DIV was displayed last!
var e = document.getElementById(id);
if (e.style.display != "none") {
$( e ).slideDown( "slow", function() {});
}
}
Его можно записать гораздо проще:
function toggle_visibility(id) {
var $e = $(document.getElementById(id));
if ($e.is(':visible')) return;
$(".alist").slideUp("slow");
$e.slideDown("slow");
}
Вы можете сделать это намного проще со всеми jQuery следующим образом:
function toggle_visibility(id) {
var newItem = $("#" + id).slideToggle("slow");
$("[name='alist']").not(newItem).slideUp("slow");
}
Это очень просто. Переключите переданный элемент и закройте все остальные, которые были открыты. Использует jQuery slideToggle()
для обработки переключения для вас.
slideToggle()
вместо этого для элемента, на который щелкнули. Я изменил свой код, чтобы показать это.