JavaScript показать / скрыть элементы HTML

Есть ли более чистый способ добиться этого в JavaScript, Я пытаюсь показать / скрыть элементы на основе функции щелчка

var overview = document.getElementById("overview"); 
var schedule = document.getElementById("schedule");
var reports = document.getElementById("reports");

    function btnOverview_Click() {
        schedule.style.display = "none";
        reports.style.display = "none";
        overview.style.display = "block";
    }       
    function btnSchedule_Click() {
        overview.style.display = "none";
        reports.style.display = "none";
        schedule.style.display = "block";
    } 
    function btnReports_Click() {
        overview.style.display = "none";
        schedule.style.display = "none";
        reports.style.display = "block";
    } 

Пожалуйста, покажите немного разметки HTML - способ вложения элементов может помочь

Roko C. Buljan 01.06.2018 13:55

«Есть ли более чистый способ добиться этого», если вы просто хотите показать / скрыть некоторые элементы, я бы сказал «нет». Но если у вас есть доступ к html и вы хотите добиться функциональности табуляции или аккордеона, тогда - да. Вы можете сделать код более универсальным, используя классы и атрибуты данных.

Yury Tarabanko 01.06.2018 13:56

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

Ash 01.06.2018 13:56

Лучше код, чтобы сделать то же самое - возможно, я ошибаюсь, но это кажется очень "раздутым" решением. Все элементы находятся на одном «уровне» - я не хочу получать к ним доступ с помощью их селектора - их позиция, идентификатор, класс могут измениться.

user7468494 01.06.2018 14:07
Поведение ключевого слова "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
4
146
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это не совсем чисто, но, по крайней мере, позволяет сэкономить несколько строк кода.

Передайте this (элемент, который запускает функцию) вашей функции и установите для всех элементов значение display: none;, но установите для элемента, который был нажат, обратно значение display: block;.

var overview = document.getElementById("overview");
var schedule = document.getElementById("schedule");
var reports = document.getElementById("reports");

function hide(element) {
  overview.style.display = "none";
  schedule.style.display = "none";
  reports.style.display = "none";
  element.style.display = "block";
}
<div id = "overview" style = "width: 100px; height: 15px; background-color: green" onclick = "hide(this)"></div>
<div id = "schedule" style = "width: 100px; height: 15px; background-color: yellow" onclick = "hide(this)"></div>
<div id = "reports" style = "width: 100px; height: 15px; background-color: blue" onclick = "hide(this)"></div>

Ага! Все эти встроенные стили и скрипты!…

Takit Isy 01.06.2018 14:42

@TakitIsy Действительно. :п

CodeF0x 01.06.2018 14:44

@TakitIsy +1 за ваш ответ, он намного лучше моего. Икс)

CodeF0x 01.06.2018 15:40

Спасибо, я ценю! :)

Takit Isy 01.06.2018 15:45

@EdwardDoyle Я думаю, вы не прокомментировали правильный ответ…;) CodeF0x, извините, что украл у вас «правильный ответ»!

Takit Isy 01.06.2018 16:42
Ответ принят как подходящий

Отказ от всех возможных встроенных стилей и JavaScript,
Предлагаю вам сделать следующее:

// I added a class in your HTML
var elements = document.querySelectorAll(".myClass");
var buttons = document.querySelectorAll(".myButtons");

// Function to hide all "elements" except the one we clicked
function hideExceptThis() {
  elements.forEach(elm => elm.style.display = "none");
  // Get the value in "data" attribute
  var id = this.getAttribute("data"); // "this" refers to the one you clicked
  document.querySelector(id).style.display = "block";
}

// On load, bind the above function on click for each element
buttons.forEach(but => but.addEventListener("click", hideExceptThis));
#panel {
  border-bottom: 1px solid gray;
  background: #eee;
  padding: 8px;
}

.myClass {
  width: 240px;
  height: 40px;
  margin: 8px;
  padding: 8px;
}

#overview { background-color: #fdd; }
#schedule { background-color: #dfd; }
#reports  { background-color: #ddf; }
<div id = "panel">
  <button class = "myButtons" data = "#overview">Only overview</button>
  <button class = "myButtons" data = "#schedule">Only schedule</button>
  <button class = "myButtons" data = "#reports">Only reports</button>
</div>
<div class = "myClass" id = "overview">Overview</div>
<div class = "myClass" id = "schedule">Schedule</div>
<div class = "myClass" id = "reports">Reports</div>

Надеюсь, поможет.

Думаю, абсолютно лучше. А чтобы сделать его на 100% идеальным, используйте elements.forEach(e=>e.style.display = "none") и elements.forEach(e=>e.addEventListener("click", hideExceptThis)).

Attersson 01.06.2018 15:26

@Attersson Спасибо за предложение, я заменил .getElementsByClassName() на .querySelectorAll(), чтобы можно было его применить.

Takit Isy 01.06.2018 15:34

@Attersson, используя .getElementsByClassName(), говорит: elements.forEach is not a function. stackoverflow.com/questions/24266313/…

Takit Isy 01.06.2018 15:44

Не имеет смысла, поскольку это массив (woops. HTMLCollection). возможно [].forEach.apply(e=>{e.style.display = "none";}, elements)

Attersson 01.06.2018 15:49

Вышеупомянутое скрывает «кнопку» (нажатый элемент) - я пытаюсь скрыть следующее: var overview = document.getElementById («overview»); var schedule = document.getElementById ("расписание"); var reports = document.getElementById ("отчеты");

user7468494 01.06.2018 15:50

кнопки находятся за пределами элементов - подумайте о плавающей боковой панели - да, я подумал, что больше html поможет - :)

user7468494 01.06.2018 15:58

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