#javascript #html #ruby-on-rails
#javascript #HTML #ruby-on-rails
Вопрос:
Это меню боковой панели, и до сих пор оно закрывает вкладки каждый раз, когда я перезагружаю страницу, и это довольно раздражает, что я должен добавить, чтобы исправить это?
вот фрагмент кода, написанный ручкой
_menu.html.erb
<div id="mySidepanel" class="sidepanel">
<button class="closebtn" onclick="closeNav()"><i class="fas fa-times-circle"></i></button>
<div class="dropdown-container">
<%= link_to "Journal", "#", class: "drop-item" %>
<%= link_to "Stats","#", class: "drop-item" %>
</div>
<li class="dropdown-btn">Suppliers
<i class="fa fa-caret-down"></i>
</li>
<div class="dropdown-container">
<%= link_to "Add a supplier", "#", class: "drop-item" %>
<%= link_to "Suppliers", "#", class: "drop-item" %>
</div>
<%= link_to "Orders", "#", class: "list-item" %>
<%= link_to "Users", "#", class: "list-item" %>
</div>
sidebar.js
редактировать, добавлен весь код, я не использую раскрывающийся список начальной загрузки
$(document).on('turbolinks:load', function() {
if ($('.dropdown-btn')){
activeTab = document.getElementsByClassName('active')[0].dataset.activeDropdown.myArticles
sessionStorage.setItem('foo', activeTab);
}
if(activeTab){
$('#mySidepanel a[href="' activeTab '"]').tab('show');
}
var dropdown = document.getElementsByClassName("dropdown-btn");
var i;
for (i = 0; i < dropdown.length; i ) {
dropdown[i].addEventListener("click", function() {
this.classList.toggle("active");
var dropdownContent = this.nextElementSibling;
if (dropdownContent.style.display === "block") {
dropdownContent.style.display = "none";
} else {
dropdownContent.style.display = "block";
}
});
}
});
function openNav() {
document.getElementById("mySidepanel").style.width = "180px";
}
function closeNav() {
document.getElementById("mySidepanel").style.width = "0";
}
Обновить
Я добавил этот js-код, но мне понадобится помощь :
$('.drop-item').on('shown.bs.tab', function (e) {
localStorage.setItem('activeTab', $(e.target).attr('href'));
});
var activeTab = localStorage.getItem('activeTab');
if(activeTab){
$('#mySidepanel a[href="' activeTab '"]').tab('show');
}
Комментарии:
1. Вы можете использовать localStorage, чтобы отслеживать, что было открыто пользователем, а затем открывать эти вкладки при загрузке страницы в следующий раз.
2. хорошо, но как? пожалуйста?
Ответ №1:
Вы должны использовать sessionStorage (я думаю, что хранилища для сеанса достаточно для того, что вы хотите сделать).
При изменении на вкладке сохраните значение вашей вкладки (например, его идентификатор):
localStorage.setItem('tabId', 'foo');
Затем, при загрузке страницы, если ваш ключ существует, откройте вашу вкладку. С jQuery должно быть что-то вроде этого:
$(function(){
if (localStorage.getItem('tabId') !== null) {
document.getElementById(localStorage.getItem('tabId')).show();
}
}
Чтобы дать вам представление. Это не более чище, чем есть. Например, вам следует переписать свою openNav
функцию, чтобы она принимала параметр (значение localStorage)
Комментарии:
1. Мне так неудобно с javascript… что именно я должен изменить в своем коде?
2. Не волнуйтесь, я тоже был, но Javascript не так ужасен. Ваш код не работает так, как есть? У вас есть что-нибудь в вашей консоли?
3. пожалуйста, поставьте
console.log(activeTab);
перед оператором if4.
console.log(activeTab);
ВОЗВРАТnull
5. У вас есть несколько элементов с одинаковым href (#), вы должны установить атрибут данных или идентификатор, будет чище. Кроме того, я не уверен, используете ли вы правильный способ получить значение ссылки, по которой вы нажали. Попробуйте войти
$(e.target).attr('href')
передlocalStorage.setItem('activeTab', $(e.target).attr('href'));