# Общий обзор возможностей JS в браузере и самого браузера. ## Браузер Браузер - программа с богатыми возможностями: - Получение данных по сети - Отображение полученных данных (**HTML**, **CSS**, Изображения, Видео) - Выполнение **Javascript**-кода, добавляющего логику и интерактивность в веб-страницах. - Отправка данных в сеть (на сервер), используя возможности **HTML** и из **Javascript** ### JS в браузере: - Может выполнять произвольный корректный **JS**-код - Может оперировать с другими частями страницы (**HTML**, **CSS**), делать с ними *что угодно*, меняя логику работы и внешний вид страницы - Может отправлять данные по сети, на сервер, с которого получена страница, или же на другие сервера, а так же открывать сетевые соединения, общаться с другими такими же браузерами для передачи данных, видео и голосовых конференций. - Может открывать и обрабатывать файлы на компьютере пользователя, отправлять их в интернет; - В современных мобильных браузерах у вас есть почти полный доступ к возможностям мобильного гаджета: * Геолокация * Фотография * Акселерометр - **Canvas**, как возможность для рисования чего угодно - графические примитивы (окружности, линии, текст), а так же попиксельного рисования (т. е. задания цвета каждой точки в отдельности) - **WebGL**, как зачатки **3D** в браузере. ### Основные вехи развития браузера и JS в нём: - **Первая эра**. 90е-начало 00х годов. В этот период сайты представляли из себя книги для чтения, *всего-лишь* с возможностью перейти по ссылке на другой сайт или страницу. JS был в начале становления и практически не применялся - **Вторая эра**. Появился **CSS**, как отдельная сущность для оформления вида страниц. В **JS** появился **AJAX**, как возможность инициировать общение с сервером незаметно для пользователя, получать данные и отправлять их без перезагрузки страниц. Появляются формы, валидация данных в них, веб становится более интерактивным, в том числе благодаря **Flash** - **Третья эра**. **HTML5**. **HTML5** взял на себя множество вещей, которые требовали ранее более сложных решений, **JS** или **Flash.** Многие эффекты теперь являются частью **CSS**, и не требуют программирования. Так же появились **Canvas**, **WebGL**, возможности смартфонов и так далее, **WebRTC**. ### HTML **HTML** (Hypertext Markup Language) - язык разметки *гипертекста*. Под гипертекстом подразумевается множество ресурсов с текстовой информацией, объединенных с помощью *гиперссылок*. В процессе развития **HTML** оброс кучей дополнительных возможностей. #### Структура HTML: ```html
`. ##### Ссылки в HTML. Ссылки в **HTML** используются для двух основных целей: для отображения пользователю с возможностью перехода, или же для каких-то технических целей. ```html google яндекс ``` Эти ссылки для пользователя. А эти - для технических целей. Именно они подключают ваш **JS** и **CSS** код в документ в repl.it: ```html .... ``` Ссылки представлены в формате **URL**(Unified Resource Locator): <протокол>://<сайт>/путь/к/файлу?<параметры> где: - **протокол** - тип сетевого протокола для обмена данными с серверами. Обычно это **http** или **https**. - **сайт** - доменное имя или IP-адрес сайта - **путь к файлу** - путь в дереве каталогов на сайте к конкретному файлу. В отличие от windows используется прямой слэш (`/`) - **параметры** - если путь ведет не к статическому файлу, а к коду, который выполняется, то в параметры могут быть переданы этому коду для обработки. Ссылки могут быть абсолютными (как выше в общей структуре URL) и относительными. В случае с относительными отсутствующие части берутся из *строки адреса браузера*: ```html .... ``` Как видите, ссылки на `index.js` и на `index.css` не содержат в себе других частей **URL**, а значит они являются *относительными*. значит мы можем открыть эти файлы, добавив адрес из строки браузера. **Проделайте это**. Относительные ссылки полезны, если вы не знаете в какой папке, или на сайте с каким именем будет располагаться ваш код. При использовании абсолютных ссылок вам придется найти и исправить сотни ссылок даже в небольшом проекте с использованием **HTML**. #### Тэги HTML: - `a`. Служит для создания ссылок на другие страницы или сайты. - `img`. Добавляет картинку. - `p`. Добавляет параграф - `div`. Добавляет контейнер для других тэгов. - `table`. Добавляет таблицу - `tr`. Добавляет строку таблицы - `td`. Добавляет ячейку таблицы - `i`. Добавляет курсивный текст - `ul`. Добавляет ненумерованный список - `ol`. Добавляет нумерованный список - `li`. Добавляет элемент списка в тэги `ul` или `li` - `input`. Добавляет поля ввода разных типов. - `textarea`. Добавляет многострочное поле ввода для текста - `select`. Добавляет выпадающий список. - `br`. Добавляет перенос строки. Тэги бывают парные и непарные. Парные могут включать в себя другие тэги и текст; непарные (`img`, `input`, `br`) не включают в себя ничего, кроме своих параметров. В конце непарного тэга желательно ставить `/`: `
`, `` и так далее. Так же тэги деляться на **блочные** и **строчные**. **Блочные** по умолчанию занимают всю ширину и начинаются с новой строки; **строчные** же обычно предназначены для придания части текста какого-то свойства (например `a` создает ссылку, `i` - курсив). Обратите внимание на `float` в **CSS** для расположения несколько блочных элементов по горизонтали рядом, или же используйте **Bootstrap** или иной фреймворк. ##### Параметры тэгов **HTML** В тэгах так же встречаются параметры, которые указаны в открывающем тэге и имеют определенный смысл в зависимости от тэга: ```html Здесь параметром является `href`, а его значение - ссылка, на которую перейдет браузер при клике
параметр `type` указывает браузеру, какой именно тип поля ввода нужен
``` Параметров может быть несколько, они записываются как <имя параметра>="<значение>" через пробел. ##### Комментарии в **HTML** ...бывают только многострочными ```html ``` ### CSS **CSS** (Cascading Style Sheets) - каскадная таблица стилей. **HTML** хранит общую структуру и информацию; а **CSS** - то, *как* эта структура отображается. Таким образом можно кардинально изменить вид сайта, просто изменив **CSS** и не меняя информацию и структуру **HTML**-документа. #### CSS-Селекторы Для того, что бы определить *стиль* (внешний вид) тех или иных элементов в дереве HTML-тэгов, нужен способ указания множества тэгов, к которым применяется стиль. Этот способ называется **CSS-Selector**, и пишется на специальном языке, который позволяет осуществлять поиск в дереве тэгов и задавать им стиль. ```css * { /* все тэги */ background-color: lightgray; } a { /* все тэги a */ color: black; } a.mainmenu { /* все тэги a, в которых параметр class="mainmenu" */ font-size: 20px; } .mainmenu { /* все тэги, в которых параметр class="mainmenu" */ background: darkgray; } #someId { /* тэг, в котором параметр id="someId" */ background-color: red; } #someId a { /* все тэги a внутри тэга с id="someId" */ color: green; } #someId > a { /* все тэги a внутри тэга с id="someId" на уровень ниже и не глубже*/ color: blue; } ``` Таким образом с помощью языка **CSS-Селекторов** вы можете выбрать множество тэгов внутри **HTML**-документа и применить те или иные настройки внешнего вида к ним. Для изучения **HTML** и **CSS** используйте [google](http://google.com), [HTMLBOOK](http://htmlbook.ru) и **Developer Tools**, который позволяет наглядно увидеть структуру **HTML** и стили, связанные с элементами в **HTML**. ### jQuery **jQuery** это библиотека, написанная на **JavaScript**, которая унифицирует и упрощает работу с **HTML** и **CSS**, используя встроенные функции **JavaScript**. Для работы с элементами **HTML** обычно используются **CSS-Селекторы** и **функции обратного вызова**. ```javascript $("#someId").click(function(){ alert("Вы нажали на элемент #someId"); }); $("#addButton").click(function(){ var a = +$("#aInput").val(); var b = +$("#bInput").val(); alert("Сумма а и b: " + (a + b)); }); ``` Пример выше назначает обработчик события `click` (клик левой кнопкой мыши) на элементы с `id="someId"` и `id="addButton"`, после чего выполняют определенные действия. Обработчик кнопки сложения так же предполагает наличие полей ввода c `id="aInput"` и `id="bInput"`. **jQuery** требует подключения, используя тэг `