Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Упрощение скрипта отображения div (https://javascript.ru/forum/misc/69200-uproshhenie-skripta-otobrazheniya-div.html)

PonyS 05.06.2017 18:22

Упрощение скрипта отображения div
 
Всем привет! Есть такой код
<script>
function Selected(a) {
  var label = a.value;
    if (label=="col1") {
       document.getElementById('col1').style.display='block';
   } else {
       document.getElementById('col1').style.display='none';
   } 
    if (label=="col2") {
       document.getElementById('col2').style.display='block';
   } else {
       document.getElementById('col2').style.display='none';
   } 
    if (label=="col3") {
       document.getElementById('col3').style.display='block';
   } else {
       document.getElementById('col3').style.display='none';
   } 
}
</script>


По клику на radio - отображается нужный div. Я сделал так что каждый radio имеет value одинаковый с id блока который нужно показать, меняется только цифра, и их может быть от 1 до 30 примерно, помогите пожалуйста упростить этот код чтобы не приходилось писать под каждый radio и div новый код... Заранее спасибо! Вот что я пробовал, но логики не особо в нем вижу:
<script>
function Selected(a) {
  var label = a.value;
    if (label==label) {
       document.getElementById(label).style.display='block';
   } else {
       document.getElementById(label).style.display='none';
   } 
}
</script>

рони 05.06.2017 21:51

j0hnik,
:blink:

рони 05.06.2017 21:54

PonyS,
var label = 'col1';
function Selected(a) {
       document.getElementById(label).style.display='none';
       label = a.value;
       document.getElementById(label).style.display='block';
}

PonyS 05.06.2017 22:07

Цитата:

Сообщение от рони (Сообщение 454607)
PonyS,
var label = 'col1';
function Selected(a) {
       document.getElementById(label).style.display='none';
       label = a.value;
       document.getElementById(label).style.display='block';
}

Спасибо, то что нужно

j0hnik 05.06.2017 22:13

Цитата:

Сообщение от рони (Сообщение 454606)
j0hnik,
:blink:

не так прочитал, sorry

ksa 06.06.2017 09:01

j0hnik, у тебя по многим темам есть удаленные сообщения. :D Не части.

j0hnik 06.06.2017 12:10

Цитата:

Сообщение от ksa (Сообщение 454629)
j0hnik, у тебя по многим темам есть удаленные сообщения. :D Не части.

Или санкции? :agree:

ksa 06.06.2017 13:23

Цитата:

Сообщение от j0hnik
Или санкции?

Просто зачем так "спамить"?

PonyS 06.06.2017 14:42

Цитата:

Сообщение от PonyS (Сообщение 454612)
Спасибо, то что нужно

Подскажите пожалуйста, а если первый col1 - изначально на странице как display:block, а остальные скрытые, и по клику на radio другой от col1 будет внизу отображаться нужный col2 к примеру, но col1 при этом не скрылся, а скрываеться уже после 2-3х раз выбора radio(запускается цепочка работы скрипта), как быть в этом случае? Заранее спасибо!

рони 06.06.2017 17:16

PonyS,
не осилил, скрипту без разницы какой блок изначально открыт или закрыт,и что в label,главное чтоб было какое -то id со страницы в label.

PonyS 06.06.2017 17:30

Цитата:

Сообщение от рони (Сообщение 454691)
PonyS,
не осилил, скрипту без разницы какой блок изначально открыт или закрыт,и что в label,главное чтоб было какое -то id со страницы в label.

Сейчас вот такая структура:
#col0 {
display: block;
}
#col1 {
display: none;
}
#col2 {
display: none;
}
При заходе на страницу - блок #col0 отображается сразу, по клику на col1 показывается ниже блока #col0 блок #col1 вместо того чтобы сразу скрыть #col0 и показать #col1. По нужному он начинает работать если "потыкать" по очереди несколько раз, а если изначально поставить #col0 {
display: none;
} то все нормально переключает, но мне нужно чтобы изначально блок #col0 отображался, а остальные были скрыты, и показывать остальные только по клику на определенный label, а предыдущий( что был до этого) - сразу скрыть и показать нужный.

j0hnik 06.06.2017 17:37

Цитата:

Сообщение от ksa (Сообщение 454652)
Просто зачем так "спамить"?

Да это не специально :no: прости братец

рони 06.06.2017 18:02

PonyS,
не понимаю ... ниже код ... что не так?
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  #col0 {
 display: block;
 }
 #col1 {
 display: none;
 }
 #col2 {
 display: none;
 }
  </style>
  <script>
  var label = 'col0';
function Selected(a) {
  document.getElementById(label).style.display='none';
  label = a.value;
  document.getElementById(label).style.display='block';
}

  </script>
</head>

<body>
<style type="text/css">
    .hot{
         border: 1px dashed Gray; padding: 5px; height: 100px; width: 100px
    }

  </style>
  <input name="f" type="radio"  onclick="Selected(this)" value="col0">
  <input name="f" type="radio" onclick="Selected(this)" value="col1">
  <input name="f" type="radio" onclick="Selected(this)" value="col2">
 <div class="hot" id="col0">0</div>
 <div class="hot" id="col1">1</div>
 <div class="hot" id="col2">2</div>
</body>
</html>

PonyS 06.06.2017 18:09

Цитата:

Сообщение от рони (Сообщение 454699)
PonyS,
не понимаю ... ниже код ... что не так?
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  #col0 {
 display: block;
 }
 #col1 {
 display: none;
 }
 #col2 {
 display: none;
 }
  </style>
  <script>
  var label = 'col0';
function Selected(a) {
  document.getElementById(label).style.display='none';
  label = a.value;
  document.getElementById(label).style.display='block';
}

  </script>
</head>

<body>
<style type="text/css">
    .hot{
         border: 1px dashed Gray; padding: 5px; height: 100px; width: 100px
    }

  </style>
  <input name="f" type="radio"  onclick="Selected(this)" value="col0">
  <input name="f" type="radio" onclick="Selected(this)" value="col1">
  <input name="f" type="radio" onclick="Selected(this)" value="col2">
 <div class="hot" id="col0">0</div>
 <div class="hot" id="col1">1</div>
 <div class="hot" id="col2">2</div>
</body>
</html>

Прошу прощения, у меня на странице дублируются radio с value в связи с такой конструкцией...
<input name="f" type="radio"  onclick="Selected(this)" value="col0">
  <input name="f" type="radio" onclick="Selected(this)" value="col1">
  <input name="f" type="radio" onclick="Selected(this)" value="col2">
то бишь на странице 2 дубля таких radio с такими же col1,2,3 , но div только 1 , без дублей. Можно ли как-то связать radio ? чтобы не зависимо от того есть ли дубли такие же radio, все равно чтобы переключало нужный div который выбрали

Вот такая сейчас у меня конструкция:
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  #col0 {
 display: block;
 }
 #col1 {
 display: none;
 }
 #col2 {
 display: none;
 }
  </style>
  <script>
  var label = 'col0';
function Selected(a) {
  document.getElementById(label).style.display='none';
  label = a.value;
  document.getElementById(label).style.display='block';
}

  </script>
</head>

<body>
<style type="text/css">
    .hot{
         border: 1px dashed Gray; padding: 5px; height: 100px; width: 100px
    }

  </style>
  <input name="f" type="radio"  onclick="Selected(this)" value="col0">
  <input name="f" type="radio" onclick="Selected(this)" value="col1">
  <input name="f" type="radio" onclick="Selected(this)" value="col2">
  <input name="fa" type="radio"  onclick="Selected(this)" value="col0">
  <input name="fa" type="radio" onclick="Selected(this)" value="col1">
  <input name="fa" type="radio" onclick="Selected(this)" value="col2">
 <div class="hot" id="col0">0</div>
 <div class="hot" id="col1">1</div>
 <div class="hot" id="col2">2</div>
</body>
</html>

рони 06.06.2017 18:32

PonyS,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
 .hot {
 display: none;
 }
 .hot.open {
   display: block;
 }

  </style>
  <script>
window.addEventListener('DOMContentLoaded', function() {
  var div = document.querySelectorAll(".hot"),
      f = document.querySelectorAll("[name='f']"),
      fa = document.querySelectorAll("[name='fa']");
      temp = div[0];
      [].forEach.call(f, function(item, i) {
              item.addEventListener('click', function() {
                    temp.classList.remove("open")
                    div[i].classList.add("open");
                    temp = div[i];
                    fa[i].checked = true;
              });
              fa[i].addEventListener('click', function() {
                    temp.classList.remove("open")
                    div[i].classList.add("open");
                    temp = div[i];
                    f[i].checked = true;
              });


          });
    });
  </script>
</head>

<body>
<style type="text/css">
    .hot{
         border: 1px dashed Gray; padding: 5px; height: 100px; width: 100px
    }

  </style>
  <input name="f" type="radio" >
  <input name="f" type="radio" >
  <input name="f" type="radio" >
  <input name="fa" type="radio" >
  <input name="fa" type="radio" >
  <input name="fa" type="radio" >
 <div class="hot open" >0</div>
 <div class="hot" >1</div>
 <div class="hot" >2</div>
</body>
</html>

PonyS 06.06.2017 18:58

Спасибо большое, то что нужно!

PonyS 13.06.2017 15:38

Цитата:

Сообщение от рони (Сообщение 454703)
PonyS,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
 .hot {
 display: none;
 }
 .hot.open {
   display: block;
 }

  </style>
  <script>
window.addEventListener('DOMContentLoaded', function() {
  var div = document.querySelectorAll(".hot"),
      f = document.querySelectorAll("[name='f']"),
      fa = document.querySelectorAll("[name='fa']");
      temp = div[0];
      [].forEach.call(f, function(item, i) {
              item.addEventListener('click', function() {
                    temp.classList.remove("open")
                    div[i].classList.add("open");
                    temp = div[i];
                    fa[i].checked = true;
              });
              fa[i].addEventListener('click', function() {
                    temp.classList.remove("open")
                    div[i].classList.add("open");
                    temp = div[i];
                    f[i].checked = true;
              });


          });
    });
  </script>
</head>

<body>
<style type="text/css">
    .hot{
         border: 1px dashed Gray; padding: 5px; height: 100px; width: 100px
    }

  </style>
  <input name="f" type="radio" >
  <input name="f" type="radio" >
  <input name="f" type="radio" >
  <input name="fa" type="radio" >
  <input name="fa" type="radio" >
  <input name="fa" type="radio" >
 <div class="hot open" >0</div>
 <div class="hot" >1</div>
 <div class="hot" >2</div>
</body>
</html>

Добрый день! Подскажите пожалуйста, как добавить в этот js код переменные (дублировать), чтоыб добавить 3-4-5 и т.д ряд <input name="fa1"><input name="fa2"><input name="fa3"> чтобы они все так же переключались, просто чтобы увеличить количество самого выбора, а то у меня получилось только копировать код полностью и менять name...Заранее спасибо!

PonyS 13.06.2017 16:06

У меня такая структура:
<input name="f" type="radio" >
<input name="f" type="radio" >
<input name="f1" type="radio" >
<input name="f1" type="radio" >
<input name="f2" type="radio" >
<input name="f2" type="radio" >
<input name="f3" type="radio" >
<input name="f3" type="radio" >
<div class="hot" >0</div>
<div class="hot" >1</div>
<div class="hot" >2</div>
<div class="hot" >3</div>
<div class="hot" >4</div>

И проблема в том, что на странице их расположение постоянно разное, т о бишь может быть только f,f1 и f3, или только f1 и f3 для выбора(может быть сразу и 20 выборов, но разные по name). аналогично с функцией open(чтобы первый radio и div его был видимый, а остальные скрыты), если расположение постоянно одинаковое - то все подходит, но если разное как у меня, и меняется постоянно, как заставить его понимать это? помогите пожалуйста...

рони 13.06.2017 16:13

PonyS,
не нужно копировать целииком ответ!
для любых name="f..."
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
 .hot {
 display: none;
 }
 .hot.open {
   display: block;
 }

  </style>
  <script>
window.addEventListener("DOMContentLoaded", function() {
    var a = document.querySelectorAll(".hot"),
        d = a.length,
        b = document.querySelectorAll("[name^='f']"),
        e = a[0];
    [].forEach.call(b, function(f, g) {
        var c = g % d;
        f.addEventListener("click", function() {
            e.classList.remove("open");
            a[c].classList.add("open");
            e = a[c];
            [].forEach.call(b, function(a, b) {
                a.checked = b % d == c
            })
        })
    })
});
  </script>
</head>

<body>
<style type="text/css">
    .hot{
         border: 1px dashed Gray; padding: 5px; height: 100px; width: 100px
    }

  </style>
  <input name="f" type="radio" >
  <input name="f" type="radio" >
  <input name="f" type="radio" >
  <input name="fa" type="radio" >
  <input name="fa" type="radio" >
  <input name="fa" type="radio" >
 <div class="hot open" >0</div>
 <div class="hot" >1</div>
 <div class="hot" >2</div>
</body>
</html>

рони 13.06.2017 16:15

Цитата:

Сообщение от PonyS
У меня такая структура:

не понимаю

PonyS 13.06.2017 16:53

Цитата:

Сообщение от рони (Сообщение 455353)
PonyS,
не нужно копировать целииком ответ!
для любых name="f..."
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
 .hot {
 display: none;
 }
 .hot.open {
   display: block;
 }

  </style>
  <script>
window.addEventListener("DOMContentLoaded", function() {
    var a = document.querySelectorAll(".hot"),
        d = a.length,
        b = document.querySelectorAll("[name^='f']"),
        e = a[0];
    [].forEach.call(b, function(f, g) {
        var c = g % d;
        f.addEventListener("click", function() {
            e.classList.remove("open");
            a[c].classList.add("open");
            e = a[c];
            [].forEach.call(b, function(a, b) {
                a.checked = b % d == c
            })
        })
    })
});
  </script>
</head>

<body>
<style type="text/css">
    .hot{
         border: 1px dashed Gray; padding: 5px; height: 100px; width: 100px
    }

  </style>
  <input name="f" type="radio" >
  <input name="f" type="radio" >
  <input name="f" type="radio" >
  <input name="fa" type="radio" >
  <input name="fa" type="radio" >
  <input name="fa" type="radio" >
 <div class="hot open" >0</div>
 <div class="hot" >1</div>
 <div class="hot" >2</div>
</body>
</html>

Спасибо больше, то что нужно! Остался вопрос с .open для первого div...подскажите пожалуйста, как можно определить на странице первый div hot и выставить ему open class? т.к. у меня порядок меняется div и radio, и если я выставлю всем open, то при первом заходе на страницу будет дубль всех div, а нужно только 1... Появилась идея jquery - найти на странице первый div с class hot из всех что есть, и добавить ему class - open, сработает так или нужно другое что-то думать?

PonyS 13.06.2017 16:59

решил вопрос с open через jquery -
$(".construct").find("div.hot:first").addClass("open");
, спасибо большое за помощь!

рони 13.06.2017 17:26

Цитата:

Сообщение от PonyS
Остался вопрос с .open для первого div...подскажите пожалуйста, как можно определить на странице первый div hot и выставить ему open class?

window.addEventListener("DOMContentLoaded", function() {
    var a = document.querySelectorAll(".hot"),
        d = a.length,
        b = document.querySelectorAll("[name^='f']"),
        e = a[0];
*!*
        e.classList.add("open");
*/!*
    [].forEach.call(b, function(f, g) {
        var c = g % d;
        f.addEventListener("click", function() {
            e.classList.remove("open");
            a[c].classList.add("open");
            e = a[c];
            [].forEach.call(b, function(a, b) {
                a.checked = b % d == c
            })
        })
    })
});


Часовой пояс GMT +3, время: 17:23.