Русскоязычные документы веб-мастеру готовы к употреблению
Где вы зарабатываете больше всего?
Яндекс.Директ
Google Adsens
Sape
Begun
Setlinks
Mainlinks
Blogun

В этой статье мы будем оптимизировать, оптимизировать, оптимизировать, в конце-концов дооптимизируемся.

1. При нажатии на кнопку в соответствующем блоке появляется текст.
<script>
function intext(){
document.getElementById('outbox').innerHTML = '<b>Текст</b>';
}
</script>
<input type="button" value="Кликни" onClick = "intext()">
<div id='outbox'></div>
У нас есть слой, id которого «outbox». При клике по кнопке (событие onClick), выполняется функция «intext()». В этой функции происходит следующее: в слой с id «outbox» вставляется html – код “<b>Текст</b>”, который после интерпретации браузером будет выглядеть как Текст

2. При нажатии на кнопку в соответствующем блоке появляется текст, но теперь id элемента страницы мы передаем в функцию в качестве аргумента.
<script>
function intext(id_result){
document.getElementById(id_result).innerHTML = '<b>Текст</b>';
}
</script>
<input type="button" value="Кликни" onClick = "intext('outbox')">
<div id='outbox'></div>
Таким образом мы можем использовать эту функцию более универсально.
<script>
function intext(id_result){
document.getElementById(id_result).innerHTML = '<b>Текст</b>';
}
</script>
<input type="button" value="Кликни" onClick = "intext('outbox')">
<div id='outbox'></div><br>
<input type="button" value="Кликни" onClick = "intext('outbox2')">
<div id='outbox2'></div><br>
<input type="button" value="Кликни" onClick = "intext('txt')"><br>
<div id='txt'></div>

3. При нажатии на кнопку в соответствующем блоке появляется текст, но теперь id элемента страницы и выводимый текст мы передаем в функцию в качестве аргумента.
<script>
function intext(id_result, outtext){
document.getElementById(id_result).innerHTML = outtext;
}
</script>
<input type="button" value="Кликни" onClick = "intext('outbox','Текст 1')"><br>
<div id='outbox'></div><br>
<input type="button" value="Кликни" onClick = "intext('outbox2','Текст 2')"><br>
<div id='outbox2'></div><br>
<input type="button" value="Кликни" onClick = "intext('outbox3','Текст 3')"><br>
<div id='outbox3'></div><br>
Как видно текст мы передаем в функцию в качестве аргумента. (параметр «outtext»)

4. Выключатель. При клике по кнопке в соответствующем блоке появляется текст «on», кликнув еще раз по той же самой кнопке, «on» меняется на «off», и наоборот.
<script>
function intext(id_result){
if(document.getElementById(id_result).innerHTML == 'on')
document.getElementById(id_result).innerHTML = 'off';
else document.getElementById(id_result).innerHTML = 'on';
}
</script>
<input type="button" value="Кликни" onClick = "intext('outbox')"><br>
<div id='outbox'>on</div><br>

Вам не кажеться, что как-то не красиво выглядит этот кусок кода?
if(document.getElementById(id_result).innerHTML == 'on')
document.getElementById(id_result).innerHTML = 'off';
else document.getElementById(id_result).innerHTML = 'on';
Намного красивее смотриться так:
document.getElementById(id_result).innerHTML = (document.getElementById(id_result).innerHTML == 'on'?'off':'on');

Оператор: expression ? operator 1 : operator 2 (так называемый тернарный оператор).
Что можно прочесть как «Если expression, то operator 1, иначе operator 2»

Это эквивалент связки if( expression ){ operator 1 }else{ operator 2 }.
Но между этими операторами есть разница, в первом «operator 1» – это один оператор и не более, в качестве альтернативы «operator 2» - то же самое - один оператор.

Хотя не в красоте дело, компактность и удобочитаемость, это два качества, которые должен учесть абсолютно любой кодер, чем компактнее код, тем меньше вероятность того, что будет допущена ошибка.

Вот собственно, «красивый» пример:
<script>
function intext(id_result){
document.getElementById(id_result).innerHTML = document.getElementById(id_result).innerHTML == 'on'?'off':'on';
}
</script>
<input type="button" value="Кликни" onClick = "intext('outbox')"><br>
<div id='outbox'>on</div><br>

5. Выключатель. При клике по кнопке в соответствующем блоке появляется текст «on», кликнув еще раз по той же самой кнопке, «on» меняется на «off», и наоборот, но теперь меняется и цвет текста.
<script>
function intext(id_result){
document.getElementById(id_result).innerHTML = document.getElementById(id_result).innerHTML == 'on'?'off':'on';
document.getElementById(id_result).style.color = document.getElementById(id_result).innerHTML == 'on'?'green':'red';
}
</script>
<input type="button" value="Кликни" onClick = "intext('outbox')"><br>
<div id='outbox'>on</div><br>
Вы наверное догадались, что цвет текста изменяется тут: «.style.color», но каскадные таблицы стилей – это отдельный разговор, поэтому об этом я рассказывать не буду.

Кажется я что-то уже говорил о компактности кода? Так вот, данный пример можно написать еще компактнее. Вот так:
<script>
function intext(id_result){
var obj = document.getElementById(id_result);
obj.innerHTML = obj.innerHTML == 'on'?'off':'on';
obj.style.color = obj.innerHTML == 'on'?'green':'red';
}
</script>
<input type="button" value="Кликни" onClick = "intext('outbox')"><br>
<div id='outbox'>on</div><br>
Мы создали переменную obj, которая унаследовала все методы и свойства элемента с id, который мы передали в функцию.

Можно еще компактнее! Так как наш JS будет передаваться вместе с веб-страничкой, а веб-страница и JavaScript это текст, а любой текст имеет размер. Чем меньше будет размер этого текста, тем быстрее он будет грузиться с сервера в окно браузера, не так ли? Все так, но нужно и меру знать. Напишем так:
<script>function intext(id_result){var o=document.getElementById(id_result);var d=o.innerHTML;
o.style.color=(o.innerHTML=d=='on'?'off':'on')?(o.innerHTML=='on'?'green':'red'):'';}</script>
<input type="button" value="Кликни" onClick = "intext('outbox')"><br><div id='outbox'>on</div><br>

Что мы сделали?
- «obj.innerHTML» встречается три раза, значит его можно сделать ссылку на него, что мы и сделали – переменная «d».
- Переменная «obj» состоит из трех символов, что больше 1-го, следовательно ее имя мы меняем, теперь не «obj», а «o»
- Преобразовали этот кусок кода:
obj.innerHTML = obj.innerHTML == 'on'?'off':'on';
obj.style.color = obj.innerHTML == 'on'?'green':'red';

Таким вот образом:
o.style.color=(o.innerHTML=d=='on'?'off':'on')?(o.innerHTML=='on'?'green':'red'):'';

- Практически весь код скрипта, впрочем и html-кода, буквально «вытянули» в одну строчку, при этом убрали все пробелы (где это допустимо).
Ну вот и все, теперь размер «сжатого» текста/скрипта меньше исходного. НО! Мне, как и Вам, кажется, точнее мы точно знаем, что «сжатый» вариант слишком запутан, не удобен для чтения.
Мы переборщили! Необязательно лишний раз «шифровать» код, не только JavaScript и html, слава богу «интернета сейчас всем хватает, на приличной скорости».

Подитожим.
- не увлекайтесь с именами переменных, т.е. пусть они состоят хотябы из 3-7 символов (ключевых). Но и слишком длинные имена переменных ни к чему.
(правда, бывают случаи, когда можно использовать и «односимвольные» переменные. Например, если в данном скрипте используется какая-либо математическая константа, несущая в себе смысловую нагрузку: число «Пи» = «p», «експонента» = «e», «количество» = «n» и т. д. Ну а для длинющих имен переменных исключений нет).
- Желательно каждый оператор писать, в отдельной строчке.
- Содержимое составного оператора «{ }», лучше писать с отступом, с левой стороны.
- Оператор «else» и набор альтернативных операторов или оператор, лучше переносить на новую строку.
- Кстате говоря комментарии, это тоже текст, так что не пишите киллометровые комментарии, либо комментарии ради самих комментариев.

ps: Это самые основные пункты, они кстате касаются не только JS но и многих других языков, причем один из этих пунктов подойдет и для языков разметки.

Автор: Бекенов Балтабек (cybri0nix) NAVAT.NET (наш партнёр)

Комментарии