Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как оптимизировать данный код (https://javascript.ru/forum/misc/64093-kak-optimizirovat-dannyjj-kod.html)

Stepan 19.07.2016 17:01

Как оптимизировать данный код
 
Приветствую,
есть код который хочу оптимизировать, подскажите пожалуйста как лучше сделать, есть идея хранить $(item).next() $(item).prev() как переменные и использовать их. возможно ли сделать что то получше? интересует именно скорость работы, спасибо
MultiPicker.updateClasses = function (item, className) {
		if ($(item).hasClass(className)) {
			if ($(item).next().hasClass(className) && $(item).prev().hasClass(className)) {
				if ($(item).next().next().hasClass(className)) {
					$(item).next().removeClass();
					$(item).next().addClass(className + " center-side");
				} else {
					$(item).next().removeClass();
					$(item).next().addClass(className + " right-side");
				}
				if ($(item).prev().prev().hasClass(className)) {
					$(item).prev().removeClass();
					$(item).prev().addClass(className + " center-side");
				} else {
					$(item).prev().removeClass();
					$(item).prev().addClass(className + " left-side");
				}
				$(item).removeClass();
				$(item).addClass("active center-side");
			} else if ($(item).next().hasClass(className) && !$(item).prev().hasClass(className)) {
				if ($(item).next().next().hasClass(className)) {
					$(item).next().removeClass();
					$(item).next().addClass(className + " center-side");
				} else {
					$(item).next().removeClass();
					$(item).next().addClass(className + " right-side");
				}
				$(item).removeClass();
				$(item).addClass("active left-side");
			} else if (!$(item).next().hasClass(className) && $(item).prev().hasClass(className)) {
				if ($(item).prev().prev().hasClass(className)) {
					$(item).prev().removeClass();
					$(item).prev().addClass(className + " center-side");
				} else {
					$(item).prev().removeClass();
					$(item).prev().addClass(className + " left-side");
				}
				$(item).removeClass();
				$(item).addClass(className + " right-side");
			}
		} else {
			if ($(item).next().hasClass("right-side")) {
				$(item).next().removeClass();
				$(item).next().addClass(className);
			}
			if ($(item).prev().hasClass("left-side")) {
				$(item).prev().removeClass();
				$(item).prev().addClass(className);
			}
			if ($(item).prev().hasClass("center-side")) {
				$(item).prev().removeClass();
				$(item).prev().addClass(className + " right-side");
			}
			if ($(item).next().hasClass("center-side")) {
				$(item).next().removeClass();
				$(item).next().addClass(className + " left-side");
			}
		}


полный код здесь https://github.com/styopdev/multiPic...multipicker.js

Spass 19.07.2016 17:03

как минимум можно писать так
$(item).next().removeClass().addClass(className + " left-side");



Всей этой лапши можно избежать если написать толковый css который будет все эти ситуации учитывать, и менять только верхний уровень.

Stepan 19.07.2016 17:10

Spass,
Спасибо большое, если у кого еще есть идеи буду рад помощи

Stepan 19.07.2016 17:17

Spass,
Классы меняются приклике и hover-е, как тут http://styopdev.github.io/multiPicker/
То есть вы предлагаете всем элементам добавить класс к примеру .active а потом уже в css разбираться кто первый кто последний при помощи :first :last?

nerv_ 19.07.2016 17:22

Цитата:

Сообщение от Stepan
Как оптимизировать данный ко

про переменные слышал? :)

Spass 19.07.2016 17:31

Цитата:

Сообщение от Stepan
Классы меняются приклике и hover-е, как тут http://styopdev.github.io/multiPicker/
То есть вы предлагаете всем элементам добавить класс к примеру .active а потом уже в css разбираться кто первый кто последний при помощи :first :last?

Да, здесь не все так просто, подумаю над этим на досуге :)

Stepan 19.07.2016 17:38

nerv_,
Вопрос до конца слабо было прочитать?

Stepan 19.07.2016 17:38

Spass,
Спасибо :)

nerv_ 19.07.2016 17:41

Цитата:

Сообщение от Stepan
Вопрос до конца слабо было прочитать?

А что там читать? Твой код говорит за тебя :)

Spass 19.07.2016 17:48

.checklist li.active:first-child,
.checklist li:not(.active) + li.active {
    border-bottom-right-radius: 0;
    border-right: 2px solid transparent;
    border-top-right-radius: 0;
}



вместо left-side :D

Stepan 19.07.2016 18:13

nerv_,
фейспалм.жпг

Stepan 19.07.2016 18:14

Spass,
Спасибо, обязательно попробую.

Spass 19.07.2016 19:06

.checklist > li.active {
    border-top: 2px solid #0036ff;
    border-bottom: 2px solid #0036ff;
    border-radius: 0;
    color: #000;
}

.checklist li.active:first-child,
.checklist li:not(.active) + li.active {
    border-bottom-left-radius: 50px;
    border-left: 2px solid #0036ff;
    border-top-left-radius: 50px;
}

.checklist li.active:last-child,
.checklist li.right-side {
    border-bottom-right-radius: 50px;
    border-right: 2px solid #0036ff;
    border-top-right-radius: 50px;
}


$('.checklist li').on('click', function(){
                $(this).toggleClass('active');
                $('.checklist li').removeClass('right-side').filter('.active').each(function(){
                    if (!$(this).next().hasClass('active')) {
                        $(this).addClass('right-side');
                    }
                });
            });


Пример https://jsfiddle.net/wtcvhn2z/

8 строчек скрипта :dance:

Stepan 20.07.2016 11:02

Spass,
Спасибо, очень помогли.

Stepan 20.07.2016 11:04

Если у кого нибудь возникнет желание стать контрибютором, буду очень рад.


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