Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Поиск элементов (https://javascript.ru/forum/events/52046-poisk-ehlementov.html)

Tecvid 01.12.2014 20:43

Поиск элементов
 
добрый вечер, скажите пожалуйтса можно ли как-то оптимизировать этот код? что-то мне не очень нравится что я каждый раз обращаюсь к одному и тому же элементу (пускай даже через переменную и через this), лучше будет если одним разом изменить все необходимые стили? такое вообще возможно в js?)

var email = document.getElementById('email');
    email.onkeypress = function() {
        this.style.borderColor = '#9DE2EE';
        this.style.color = '#434343';
        this.style.backgroundImage = 'none';
    };
    email.onfocus = function() {
        if (this.value == 'E-mail') {
            this.value = '';
            this.style.color = '#434343'; 
        }
    };
    email.onblur = function() {
        if (this.value == '') {
            this.value = 'E-mail';
            this.style.color = '#BBB';
            this.style.borderColor = '#9DE2EE';
            this.style.backgroundImage = 'none'; 
        }
        else if (this.value != '' || this.value != 'E-mail') {
            if (/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/.test(this.value)) {
                $.ajax({
                    type: 'GET',
                    url: '/reg/check/?v=email&val=' + this.value,
    				cache: false,
    				success: function(data) {
    				    if (data > 0) {
    				        email.style.borderColor = '#F29793';
                            email.style.color = '#F2645C';
                            email.style.background = 'url(/assets/img/denied.gif) 172px 10px no-repeat';
    				    } else {
    				        email.style.borderColor = '#89CFB0';
                            email.style.color = '#50BA88';
                            email.style.background = 'url(/assets/img/accepted.gif) 171px 10px no-repeat';
    				    }
    				}
                });
            } else {
                email.style.borderColor = '#F29793';
                email.style.color = '#F2645C';
                email.style.background = 'url(/assets/img/denied.gif) 172px 10px no-repeat';
            }
        }
    };

danik.js 01.12.2014 20:49

А css-классы наверно для дураков придумали, да?

Tecvid 01.12.2014 20:52

Цитата:

Сообщение от danik.js
А css-классы наверно для дураков придумали, да?

с классам не получится, слишком много чего нужно сделать програмно, а с этим цсс не справляется, это всего лишь кусок кода :)

Tecvid 01.12.2014 20:54

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

krutoy 01.12.2014 21:02

Был вариант с with, но его выпилили. Можно как то так:
<html>
<head></head>

<div>div</div>
 
<body>
<script>

div=document.querySelector("div")

//старый вариант:
//with(div.style){
//  background="red"
//  border="2px solid black"
//}

f=function(o){
   for(var i in o){this.style[i]=o[i]}
}

f.call(div, {background: "red", border: "5px solid black"})



</script>
</body>
</html>

Но это к оптимизации не относится, это что-то типа рефакторинга, наверное.

danik.js 01.12.2014 21:07

Ебать ты отсталый. Ты проспал плейсхолдеры, проспал html5 валидацию. Все блядь проспал.
<style>
input{
    border: 1px solid #9DE2EE;
}
input:focus{
    color: #434343;
}
input.invalid{
    border-color: #F29793;
    color: #F2645C;
}
::-webkit-input-placeholder{
    color: #BBB;
}
:-moz-placeholder{
    color: #BBB;
    opacity: 1;
}
::-moz-placeholder{
    color: #BBB;
    opacity: 1;
}
:-ms-input-placeholder{
    color: #BBB;
}
</style>
<form>
    <input type="email" name="email" id="email" placeholder="E-mail" pattern="[\w-\.]+@([\w-]+\.)+[\w-]{2,4}" required="" />
</form>
<script>
var email = document.getElementById('email');
email.form.noValidate = true; // отключаем html5 валидацию
email.onblur = function() {
    if (!this.value) {
        email.className = email.className.replace(/\s*invalid/, '');
        return;
    }
    var pattern = new RegExp('^' + this.getAttribute('pattern') + '$');
    if (!pattern.test(this.value)) {
        email.className += ' invalid';
        return;
    }
    /*$.ajax({
        type: 'GET',
        url: '/reg/check/?v=email&val=' + this.value,
        cache: false,
        success: function(data) {
            if (data > 0) {
                email.className += ' invalid';
            } else {
                email.className = email.className.replace(/\s*invalid/, '');
            }
        }
    });*/
};
</script>

Tecvid 01.12.2014 21:08

вообщем получается что через js другого элегантного варианта нет) понятно, спасибо большое

danik.js 01.12.2014 21:09

Стоп. А че за хуйня? jQuery же подключил себе? Дык вешай обработчики по-людски, а не через допотопный .onblabla. Ну и классы как бы тоже через jQuery проще щелкать.

danik.js 01.12.2014 21:10

Цитата:

Сообщение от Tecvid
вообщем получается что через js другого элегантного варианта нет)

Какой нахуй элегантный вариант? Ты понимаешь вообще че просишь?
Это как если бы тракторист просил себе элегантный трактор.

Tecvid 01.12.2014 21:10

Цитата:

Сообщение от danik.js
Ебать ты отсталый. Ты проспал плейсхолдеры, проспал html5 валидацию. Все блядь проспал.

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

danik.js 01.12.2014 21:10

Нужны элегантные стили - юзай css-классы. Элегантнее некуда.

Tecvid 01.12.2014 21:11

Цитата:

Сообщение от danik.js (Сообщение 343800)
Стоп. А че за хуйня? jQuery же подключил себе? Дык вешай обработчики по-людски, а не через допотопный .onblabla. Ну и классы как бы тоже через jQuery проще щелкать.

его временно подключил чтоб с ajax не париться пока что

danik.js 01.12.2014 21:12

Цитата:

Сообщение от Tecvid
но html4 пока что не вымер

Нет никакого html4, нет html5. Есть html.

krutoy 01.12.2014 21:12

Tecvid,
Чем Вам вариант с миксином не подходит? Или я неправильно понял проблему?

Tecvid 01.12.2014 21:13

Цитата:

Сообщение от danik.js
Какой нахуй элегантный вариант? Ты понимаешь вообще че просишь?
Это как если бы тракторист просил себе элегантный трактор.

всмысле меньше кода, меньше поиск элементов, но один и тот же результат

danik.js 01.12.2014 21:13

Цитата:

Сообщение от Tecvid
но html4 пока что не вымер

Про грейсфул деградэйшн не слыхал? Во дерёвня ))

Tecvid 01.12.2014 21:15

Цитата:

Сообщение от krutoy
Чем Вам вариант с миксином не подходит? Или я неправильно понял проблему?

похоже вы не правильно поняли :)

danik.js 01.12.2014 21:16

Я тебе открою тайну: если ты будешь использовать html5 фишки, то html4 браузеры не перестанут работать с твоим сайтом :) Они тупо проигнорируют эти фишки и все.

Tecvid 01.12.2014 21:17

Цитата:

Сообщение от danik.js
Про грейсфул деградэйшн не слыхал? Во дерёвня ))

вобщем, с тобой всё понятно)

danik.js 01.12.2014 21:18

Открой любой недопотопный сайт и посмотри как там верстают формы.
Ну конечно, если ты ориентируешься на IE6 юзеров, и собираешься поставить себе на сайте плашку "Best viewed in IE6", то ок, у мня вопросов нет :))

Tecvid 01.12.2014 21:18

Цитата:

Сообщение от danik.js
Я тебе открою тайну: если ты будешь использовать html5 фишки, то html4 браузеры не перестанут работать с твоим сайтом Они тупо проигнорируют эти фишки и все.

но при этом упадёт весь дизайн, а это мне не нравится ;)

Tecvid 01.12.2014 21:19

Цитата:

Сообщение от danik.js
Ну конечно, если ты ориентируешься на IE6 юзеров

на IE я давно забил)

danik.js 01.12.2014 21:22

Еще раз: моя хуета будет работать даже в IE6. Просто помимо этого в новых браузерах будут бонусы, как то: работа с отключенным js (раз поставишь себе noscript и уже не сможешь отказаться от него. как минимум сайты грузятся быстрей на порядок и работают без глюков, если разработчик не рукожоп), удобная клава на мобиле/планшете ну и далее в зависимости от того, че ты юзаешь.

danik.js 01.12.2014 21:23

Цитата:

Сообщение от Tecvid
но при этом упадёт весь дизайн, а это мне не нравится

ЧЕЕЕЕ??? Ты о чем вообще?

Тыкни пальцем че где упало?

danik.js 01.12.2014 21:24

Если ты про <header> и прочие теги, то да. В IE8 и младше, если отключены скрипты в нем, то страница, да, развалится. Но я то не за теги тебе говорю же.

danik.js 01.12.2014 21:26

От этих тегов толку вообще ноль. От некоторых только чутка.
Разве что для слепых role автоматически разпознаются. Ну нам то похуй на слепых.

danik.js 01.12.2014 21:32

А, забыл сказать. Для IE8-9 нужно подключить placeholder.js (погугли).

danik.js 01.12.2014 21:34

Можешь подключить classList.js и не париться с классами, а писать так:
el.classList.add('abc');
el.classList.remove('cde');

Tecvid 01.12.2014 21:43

Цитата:

Сообщение от danik.js
ЧЕЕЕЕ??? Ты о чем вообще?

Тыкни пальцем че где упало?

ну смотри, если я буду пользоваться html5 и css3, то html4 булет прогигнорировать его, и дизайн будет выглядеть...

Цитата:

Сообщение от danik.js
А, забыл сказать. Для IE8-9 нужно подключить placeholder.js (погугли).

знаю про него, откопал в те времена когда под осла тоже верстал)

Цитата:

Сообщение от danik.js
Можешь подключить classList.js

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

danik.js 01.12.2014 22:17

Цитата:

Сообщение от Tecvid
ну смотри, если я буду пользоваться html5 и css3, то html4 булет прогигнорировать его, и дизайн будет выглядеть...

Да? А я чет верстаю уже который год, и даже не знал об этом :lol:

Конкретней объясни с чем у тебя проблемы. Про <header> и прочие теги я уже говорил. Но учитывая что ie8, да еще с отключенным js еще поискать надо, то я их использую. Хотя не критично.

danik.js 01.12.2014 22:18

Цитата:

Сообщение от Tecvid
нуу я стараюсь как можно меньше лишнего подключить, ну лишними они не бывают, просто стараюсь обойтись без них по мере возможности, как-то так

Старых возможностей удалять/добавлять класс нет. Поэтому то и придумали classList. Как минимум напиши функции addClass/removeClass, если не хочешь использовать classList. Хотя по размеру кода там разница не серьезная, а использовать стандартные API куда приятнее и лучше в плане поддержки.

Tecvid 01.12.2014 22:44

Цитата:

Сообщение от danik.js
Да? А я чет верстаю уже который год, и даже не знал об этом

просто дизайн у меня навороченный
p.s: верстаю 7-ой год, просто 6 лет чисто на css, так как я в основном с php возился, с дизайном не очень-то парился, а вот год назад уже начал изучать js и постепенно начинаю с ним микшировать css)

Цитата:

Сообщение от danik.js
Конкретней объясни с чем у тебя проблемы

ну ыроде я конкретно объяснял, ну вобщем
Цитата:

Сообщение от danik.js
Как минимум напиши функции addClass/removeClass

скорее всего так и сделаю

danik.js 01.12.2014 23:01

Цитата:

Сообщение от Tecvid
верстаю 7-ой год

Не верю. Либо ты эти 7 лет ничему не научился. Короче, не надо ля ля.
[/quote]
Цитата:

Сообщение от Tecvid
ну ыроде я конкретно объяснял

Процитируй, пожалуйста. Что и в каком браузере будет неправильно отображаться.

danik.js 01.12.2014 23:02

<style>
input{
    border: 1px solid #9DE2EE;
}
input:focus{
    color: #434343;
}
input.invalid{
    border-color: #F29793;
    color: #F2645C;
}
::-webkit-input-placeholder{
    color: #BBB;
}
:-moz-placeholder{
    color: #BBB;
    opacity: 1;
}
::-moz-placeholder{
    color: #BBB;
    opacity: 1;
}
:-ms-input-placeholder{
    color: #BBB;
}
</style>
<form>
    <input type="email" name="email" id="email" placeholder="E-mail" pattern="[\w-\.]+@([\w-]+\.)+[\w-]{2,4}" required="" />
</form>
<script>
var email = document.getElementById('email');
email.form.noValidate = true; // отключаем html5 валидацию
email.onblur = function() {
    if (!this.value) {
        email.classList.remove('invalid');
        return;
    }
    var pattern = new RegExp('^' + this.getAttribute('pattern') + '$');
    if (!pattern.test(this.value)) {
        email.classList.add('invalid');
        return;
    }
    email.classList.remove('invalid');
    /*$.ajax({
        type: 'GET',
        url: '/reg/check/?v=email&val=' + this.value,
        cache: false,
        success: function(data) {
            if (data > 0) {
                email.classList.add('invalid');
            } else {
                email.classList.add('remove');
            }
        }
    });*/
};
</script>

Tecvid 01.12.2014 23:11

Цитата:

Сообщение от danik.js
Не верю. Либо ты эти 7 лет ничему не научился. Короче, не надо ля ля.

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

Цитата:

Сообщение от danik.js
Процитируй, пожалуйста. Что и в каком браузере будет неправильно отображаться.

давай как зобьём на эту тему, я бы с удовольсвием поболтал бы тут, да часы тикают и не ждут меня)

danik.js 01.12.2014 23:29

Нет, ну я конечно встречал людей, у которых стойкое мнение, что если html5 - то обязательно нет поддержки старых браузеров. Но не с 7-летним стажем ))


Не поддерживает браузер [placeholder]? Подключаем полифил на js.
Не поддерживает input[type=email] ? Нихера не делаем. Потому что неподдерживаемые инпуты превращаются в input[type=text]. Ну и нам то че.


Не поддерживается html5 валидация? Ну и пох. Это чисто бонус для новых браузеров. На сервере один хрен валидация нужна, как не крути.

Хочется юзать новые теги - подключай полифил. Тем более что он через кондишнл комментс подключается, а значит полностью игнорируется другими браузерами. Оверхед - нулевой.

Не поддерживается css3 анимация? Ну значит будут резкие переходы.
Градиенты? Фолбэк на монотонный цвет. Скругления? Фолбэк на квадратные углы (чаще даже симпотней смотрится). Ну и тд и тп. Все это сам должен знать.

danik.js 01.12.2014 23:33

Цитата:

Сообщение от Tecvid
html4 пока что не вымер

Как можно было такой бред сгенерировать - не понимаю.
Как будто HTML5 - это какой-то совсем другой стандарт, не совместимый с html4 :)

Tecvid 01.12.2014 23:47

Цитата:

Сообщение от danik.js
Не поддерживается css3 анимация? Ну значит будут резкие переходы.
Градиенты? Фолбэк на монотонный цвет. Скругления? Фолбэк на квадратные углы (чаще даже симпотней смотрится). Ну и тд и тп. Все это сам должен знать.

ну вот тебе и абсолютно другой дизайн :)

danik.js 01.12.2014 23:51

Tecvid, а, ну тогда верстай картинками, че :) будут и скругления и градиенты ))
Есть конечно еще PIE.htc но с ним только хуже будет.

Но ты вообще-то говорил совсем о другом:
Цитата:

Сообщение от Tecvid
но при этом упадёт весь дизайн, а это мне не нравится


danik.js 01.12.2014 23:51

Короче, не вижу мысла убеждать. Если чайник хочет оставаться чайником - пускай.


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