Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   javascript tabs (https://javascript.ru/forum/events/51184-javascript-tabs.html)

Smike 27.10.2014 22:31

javascript tabs
 
Всем привет. Сегодня у меня нестандартный вопрос. Я решил реализовать табы на js (впервые). Их реализацию вы можете увидеть по ссылке

http://jsfiddle.net/zenrgu38/

Но лично мне кажется, что реализация хромает. каждый раз браузер обходит элементы в цикле - не очень эффективное решение. Мне интересно ваше мнение. Большое спасибо! =)

Да, и забудем про то, что это не кроссбраузерно(getElementsByClassNam e, addEventListener and classList) ибо исправить это не такая большая проблема. Вопрос именно в реализации.

bes 27.10.2014 23:00

реши через делегирование событий

Цитата:

Сообщение от Smike
Да, и забудем про то, что это не кроссбраузерно(getElementsByClassNam e, addEventListener and classList)

забудь про некроссбраузерность

danik.js 27.10.2014 23:17

para[0].classList.remove("hide");

Вот это явно не в цикле должно быть ) Этого вообще не должно быть. Че за дрочка - добавили класс hide - передумали, убрали класс hide ))

По клику никаких циклов уже не должно быть. Ну не нужно добавлять класс hide элементам, которые уже и так его имеют. Добавляй его только нескрытому элементу.

рони 27.10.2014 23:22

Smike,
http://jsfiddle.net/zenrgu38/1/

Vlasenko Fedor 27.10.2014 23:26

Вот и я с этого начинал велосипедить :)
Мои две реализации табов на jQuery
http://jsfiddle.net/vlasenkofedor/82kSU/
на чистом JS
http://jsfiddle.net/vlasenkofedor/jLprM/
Но совершенству нет предела, так что улучшайте

kostyanet 28.10.2014 04:14

Цитата:

Сообщение от danik.js
По клику никаких циклов уже не должно быть.

Тем не менее у профессоров все на циклах.

Отсюда вопрос. Произвольный доступ можно ведь организовать на двух сущностях - current и previous - или практически нельзя?

danik.js 28.10.2014 06:13

Цитата:

Сообщение от kostyanet
current и previous - или практически нельзя?

Это всего лишь переменные. С каких пор переменные нельзя использовать практически? И причем тут произвольный доступ.

Smike 28.10.2014 11:31

Цитата:

Сообщение от danik.js (Сообщение 337918)
para[0].classList.remove("hide");

Вот это явно не в цикле должно быть ) Этого вообще не должно быть. Че за дрочка - добавили класс hide - передумали, убрали класс hide ))

По клику никаких циклов уже не должно быть. Ну не нужно добавлять класс hide элементам, которые уже и так его имеют. Добавляй его только нескрытому элементу.

Нда, то что этот элемент в цикле - явная глупость =)

Smike 28.10.2014 11:33

Цитата:

Сообщение от рони (Сообщение 337920)

Рони, не понимаю одного в этом примере.

вот ты сохраняешь в переменную old первый параграф и скрываешь его при клике на link.
как тогда скрываются другие параграфы? то есть para[1], para[2] и т.д.

рони 28.10.2014 12:04

Smike,
в переменной old всегда находится элемент открытый в прошлый раз - перед открытием нового элемента -- элемент в old скрывается -- в него записывается новый и новый old открывается - так понятнее?

Smike 28.10.2014 12:17

Цитата:

Сообщение от рони (Сообщение 337992)
Smike,
в переменной old всегда находится элемент открытый в прошлый раз - перед открытием нового элемента -- элемент в old скрывается -- в него записывается новый и новый old открывается - так понятнее?

Рони, я понял! Это гениально, сам бы в связи с отсутствием опыта не додумался до такого =)

Smike 28.10.2014 12:20

Большое всем спасибо за помощь!
очень радует, что здесь живой форум, и люди тратят свое время помогая таким как я.

Напоследок у меня такой вопрос ко всем. Есть ли смысл использовать document.ready (из jquery) или аналоги на js в реальных проектах?
или же нужно просто добавлять скрипты перед </body> ?

рони 28.10.2014 12:46

Smike,
как вам и коду удобнее :)
http://javascript.ru/forum/jquery/32...ent-ready.html
http://javascript.ru/forum/misc/2418...at-kod-js.html
http://javascript.ru/forum/misc/3018...-v-fajjle.html
ещё найдутся темы если поискать.

danik.js 28.10.2014 13:18

Цитата:

Сообщение от Smike
или же нужно просто добавлять скрипты перед </body>

Во всех проектах всегда так делаю. Кто так не делает - вероятно не любит быстрые сайты. Или считает что у всех посетителей оптоволокно )

kostyanet 08.11.2014 22:52

Цитата:

Сообщение от danik.js
Или считает что у всех посетителей оптоволокно )

А я пишу скрипты прямо в хтмл. Будет мне за это оптоволокно?

kostyanet 08.11.2014 22:59

Придется процитировать целиком

Цитата:

Сообщение от рони (Сообщение 337992)
Smike,
в переменной old всегда находится элемент открытый в прошлый раз - перед открытием нового элемента -- элемент в old скрывается -- в него записывается новый и новый old открывается - так понятнее?

Ибо его олд пиздит:

var para = document.getElementsByClassName("para");
for(var j = 1; j < para.length; j++) {
	var par = para[j];
	par.classList.add("hide");
}

var links = document.getElementsByClassName("link"), old = para[0];

for(var i = 0; i < links.length; i++) {
	var link = links[i];
	link.addEventListener("click", function() {
	    old.classList.add("hide");
        old = this.nextElementSibling
		old.classList.remove("hide");
	}, false);
}


о том что у него на стеке глубиной 1 сделано. Это обычный цикл заретушированной раздачей экземпляра листовки всем участникам по-очереди.

Слабо сделать без единого for? Напрягитесь, вы сможете.

рони 08.11.2014 23:15

kostyanet,
ничего не понял из того что вы написали, впрочем как обычно.


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