Закладки на JavaScript

285
04 марта 2017, 04:48

Всем доброго пятничного дня. Как я писал ранее, я изучаю JavaScript по книге Хавербеке. Одно из заданий звучит так:

Интерфейс закладок встречается часто. Он позволяет вам выбирать панель интерфейса, выбирая одну из нескольких торчащих закладок над элементом. В упражнении вам нужно сделать простой интерфейс закладок. Напишите функцию asTabs, которая принимает узел DOM, и создаёт закладочный интерфейс, показывая дочерние элементы этого узла. Ей нужно вставлять список элементов вверху узла, по одному на каждый дочерний элемент, содержащих текст, полученный из атрибута data-tabname. Все, кроме одного из дочерних элементов, должны быть спрятаны (при помощи display style none), а текущий видимый узел можно выбирать нажатием кнопки. Когда оно заработает, расширьте функционал, чтобы у текущей активной кнопки был свой стиль.

В общем на Ваш суд, интересно будет послушать мнение каждого, и профессионала и любителя

function asTabs(node) { 
  if (node.nodeType !== 1) return "Not elementNode"; 
  node.className = "wrapper"; 
  var divs = Array.prototype.filter.call(node.children, function(elem) { 
    return elem.nodeName === "DIV"; 
  }); 
  Array.prototype.forEach.call(divs, function(child, index) { 
    var button = document.createElement("button"); 
    button.textContent = child.getAttribute("data-tabname"); 
 
    if (index !== 0) child.style.display = "none"; 
    else child.style.display = ""; 
    button.className = "tab_passive"; 
 
    button.addEventListener("click", function(event) { 
      var buttonsClassNames = document.getElementsByClassName("tab_active"), 
        childrenWrapper = node.children; 
      Array.prototype.forEach.call(buttonsClassNames, function(button) { 
        if (button.className === "tab_active") button.className = "tab_passive"; 
      }); 
      Array.prototype.forEach.call(childrenWrapper, function(childWrapper) { 
        if (childWrapper.style.display === "") childWrapper.style.display = "none"; 
      }); 
      child.style.display = ""; 
      event.target.className = "tab_active"; 
    }); 
    document.body.insertBefore(button, node); 
  }); 
  document.getElementsByClassName("tab_passive")[0].className = "tab_active"; 
} 
 
asTabs(document.querySelector("#wrapper"));
.wrapper { 
  width: 350px; 
  height: 150px; 
  border: 4px solid firebrick; 
  background: lemonchiffon; 
  padding: 5px; 
} 
 
.tab_active { 
  border: 4px solid firebrick; 
  border-bottom: 0; 
  border-radius: 4px 4px 0 0; 
  background: lemonchiffon; 
  margin-right: 5px; 
  width: 100px; 
  outline:none; 
} 
 
.tab_passive { 
  border: 4px solid firebrick; 
  border-bottom: 0; 
  border-radius: 4px 4px 0 0; 
  background: teal; 
  margin-right: 5px; 
  width: 100px; 
  outline:none; 
}
<div id="wrapper"> 
  <div data-tabname="one">Закладка один</div> 
  <div data-tabname="two">Закладка два</div> 
  <div data-tabname="three">Закладка три</div> 
</div>

Вот как вариант исправленных, только стили надо переделывать

function asTabs(node) {
    if(node.nodeType!==1) return "Not elementNode";
    node.className = "wrapper";
    var elementsTab = Array.prototype.filter.call(node.children,function(elem){
        if(elem.getAttribute("data-tabname")) return elem.nodeName;
        else elem.innerHTML = "";
    });
    var bookmarks = document.createElement("div");
    bookmarks.className = "bookmarks";
    node.insertBefore(bookmarks, node.firstElementChild);
    Array.prototype.forEach.call(elementsTab, function(child,index){
        var bookmark = document.createElement("button");
        bookmark.textContent = child.getAttribute("data-tabname");
        if(index!==0) child.style.display = "none";
        else child.style.display = "";
        bookmark.className = "tab_passive";
        bookmark.addEventListener("click",function(event){
            var bookmarkClassNames = node.getElementsByClassName("tab_active");
            Array.prototype.forEach.call(bookmarkClassNames,function(button){button.className="tab_passive"});
            Array.prototype.forEach.call(elementsTab,function(childWrapper){childWrapper.style.display = "none"});
            child.style.display = "";
            event.target.className = "tab_active";
        });
        bookmarks.appendChild(bookmark);
    });
    node.firstElementChild.firstElementChild.className="tab_active";
}

Но теперь до меня дошло, что я не понимаю откуда событие "помнит" что такое node и что такое child

READ ALSO
Проблема при передачи AJAX запроса в Laravel

Проблема при передачи AJAX запроса в Laravel

Не понемаю почему не получается передать запрос в контроллер средствами AJAX Цель нудно изменить значение $article->public на 0 (по дефолту 1)

274
Как правильно добавить события к динамически создаваемым элементам?

Как правильно добавить события к динамически создаваемым элементам?

Исользую jqueryМне нужно сделать, чтобы при наведении на любую ссылку в документе, отображалось бы - alert("ссылка")

333
Как работает eventData в jQuery?

Как работает eventData в jQuery?

Нужно на on('click') элемента назначить некоторую функцию, описанную в другой части скрипта и передать в эту функцию параметрПрочитал о том, что...

226
Рандом в крестиках ноликах

Рандом в крестиках ноликах

Я сделал простую версию игры крестики ноликиПри нажатии на ячейку, в ней появляется крестик и вызывается функция, что бы поставить нолик...

271