Замечательный JavaScript ч. 3: Работа с DOM и BOM

декабря 10, 2011  |  Published in ClientSide, JavaScript

BOM — Browser Object Model — объектная модель браузера
BOM — представляет собой древовидную структуру, иерархию объектов браузера. Во главе этой структуры стоит объект window и представляет он собой само окно браузера. window также является глобальным объектом, то есть внутри него расположена глобальная область видимости и любая глобальная функция или переменная является соответственно методом или свойством объекта window.

Наиболее интересными функциями и свойствами window являются следующие:

window.navigator — информация о браузере.

window.innerHeight, window.innerWidth — внутренняя высота и ширина браузера, то есть размер области, которая отображает сайт.

window.outerHeight, window.outerWidth — внешняя высота и ширина, то есть размер самого окна браузера.

window.load() — функция-обработчик события загрузки сайта.

window.location — объект предоставляет информацию об адресе страницы и методы для редиректа, обновления страницы и т.д.

screen — объект предоставляющий информацию о пользовательском дисплее.

screenLeft(screenX), screenTop(screenX) — положение верхнего левого угла окна браузера.

scrollY, scrollX — положения горизонтальной и вертикальной полос прокрутки.

В этой статье мы рассматриваем BOM достаточно поверхностно так как для разработки веб-приложений нам это не сильно нужно знать. Интерес представляют только свойства дающие информацию о браузере пользователя, размерах экрана/браузера и локация.

DOM — Document Object Model — объектная модель документа.

DOM является структурой вложенной в BOM. DOM содержит дерево всех элементов страницы и методы для работы с ними. Самыми популярными методами являются:

document.getElementById() — позволяет получить элемент по его ID.

document.getElementsByClassName() — позволяет получить элементы по их классу.

document.getElementsByName() — позволяет получить элементы по их имени.

document.getElementsByTagName() — позволяет получить элементы по имени тега.

document.getElementsByTagNameNS() — позволяет получить элементы по их имени, которые содержатся в определенной области видимости (оптимизированная версия getElementsByTagName).

Прежде, чем мы продолжим знакомится с остальными методами и свойствами для работы с DOM давайте подробнее рассмотрим что это такое и из чего DOM состоит. DOM описывается сразу тремя спецификациями разработанными W3C (W3C Level 1 DOM, W3C Level 2 DOM, W3C Level 3 DOM), которые были разработаны в разное время и соответственно в разной степени поддерживаются браузерами. В этой статье мы в первую очередь будем обращать внимание на DOM Level 1 так как он поддерживается полностью (или почти полностью) всеми современными (и не очень современными) браузерами. Вообще каждый Leve l является наслоением над предыдущим и добавляет определение новых свойств и методов для работы с DOM.

DOM состоит из узлов (node). О типах узлов позже.

<div>
  <p>
    <a>link</a> some text
  </p>
</div>

Можно изобразить так:

Read the rest of this entry »

Tags: , , ,

RDRubyTutorial: Метапрограммный Ruby

октября 19, 2011  |  Published in Ruby, Основы

Метапрограммный Ruby
Эта статья-учебник даст вам самые основные знания и понимания программирования на языке Ruby. В ней, в отличие от RubyDev Ruby Tutorial (RDRT) не будет рассматриваться работа с какими-нибудь конкретными объектами, например строками или целыми числами, или с массивами, или с чем-либо еще. Мы будем рассматривать синтаксис и основные концепции языка и не будем изучать методы и приемы работы с определенными объектами — все это описано в официальной документации (учите английский).

Автор (то есть я) предполагает, что вы в общих чертах знаете, что такое Ruby, читали блог RubyDev или статью о Ruby в Wikipedia, по этому я не намерен повторяться и рассказывать о происхождении языка, истории, его авторе и прочих практически бесполезных вещах.

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

1. Объекты
Ruby — объектно-ориентированный язык, а значит все, с чем мы работаем — объекты. Объекты принадлежат определенному классу (типу), например вы, мой дорогой читатель, которого, предположим зовут Александр Сергеевич принадлежите классу людей, или группе людей, или ваш тип, как объекта — человек.

Александр Сергеевич, кто вы?  — Я — Человек!

Объект — это набор свойств и методов. Александр Сергеевич, вы например, имеете свойства: имя, фамилия, отчество, рост, вес, цвет волос и так далее, но также вы имеете методы, то есть вы можете выполнять некоторую работу (выполнять некоторые функции), например, сидеть, стоять, разговаривать и отвечать комментариями на мои статьи.

Для того, чтобы появился новый объект вашего типа, Александр Сергеевич, вам следует совокупиться с некоторой человеческой особью женского пола и через 9 месяцев будет получен новый объект класса человек. В Ruby процесс создание новых объектов более быстрый и менее ресурсоемкий. Чуть позже мы разберемся с ним, а сейчас поговорим о классах.

Read the rest of this entry »

Tags: , ,

RDR3R: Callbacks (коллбеки — обратные вызовы) в Rails

октября 5, 2011  |  Published in Ruby on Rails, Ruby on Rails 3

Callbacks — колбеки (обратные вызовы) — это вызов методов как реакция на какое-нибудь действие объекта. Коллбеки привязываются к определенным методом и могут быть выполнены до или после вызова метода к которому они прикреплены. Например, когда в Rails вы используете ассоциацию с зависимостью, например такую:

Post has_many :comments, :dependent => :destroy

То после действия destroy для объекта — записи запускается соответствующий after_destroy коллбек, который выполняет удаление всех принадлежащищ Post’у комментариев.

В Rails существуют коллбеки модели и колбеки контроллеров, в Sinatra (Rack) существуют коллбеки обработчиков запроса, даже в RSpec существуют коллбеки before и after для подготовки и удаления данных для спецификаций.
Read the rest of this entry »

Tags: , , ,

Паттерн программирования Singleton

октября 3, 2011  |  Published in Ruby, STDLIB

Singleton (одиночка) — паттерн программирования позволяющий создавать такие классы, которые могут иметь только один экземпляр. Можно подумать, что это глупый паттерн, ибо если вам нужен один экземпляр (копия) класса, то вы просто создаете его и не создаете больше экземляров. Я тоже так думал и даже пытался найти обоснование тому, почему этот паттерн существует. Я понимал, что все эти паттерны были придуманы людьми куда-более умными, образованными и опытными чем я, и кажащаяся бесполезность pattern Singleton — это всего-лишь мое невегласие. Вот к чему я пришел:

Допустим у нас имеется одно приложение состоящее из нескольких модулей, например тот же фреймворк Rails, или какое-нибудь десктопное приложение. Представьте, что в контексте одного модуля вы создаете некоторый объект, который в предложении может быть только один, например объект — запрос пользователя, которых хранит различную информацию о запросе, методы ее представления и что-то еще, или это десктопное приложение и объект представляет собой обычное окно приложение и это приложение является однооконным. Теперь добавим услувие, что мы подмешивая один модуль в другой не можем получить доступ к объекту на прямую, он инициируется внутри какого-то метода, что-то там делает, но метод нам его не возвращает, в этом случае все, что мы можем сделать — это создать новый объект, а старый будет для нас утерян если мы не создали какого-нибудь специального аксессора для доступа к нему.

Честно признаться в Ruby можно хорошо обходиться без использования Singleton, однако, вам может быть полезно и интересно знать о нем, просто для общего развития или для применения в других языках программирований.
Read the rest of this entry »

Tags: , , ,

HAML в Rails

октября 2, 2011  |  Published in ClientSide, Ruby Gems, Ruby on Rails, Ruby on Rails 3, View

haml logoHAML — очень удобный язык разметки который призван заменить HTML. HAML это также шаблонизатор, который компилирует код на HAML + Ruby  в HTML, который представляется пользователю.

Мне надоел стандартный ERB, надоели закрывающие теги, надоело, что порой бывает сложно понять что во что вложено, и я решил полностью перебраться на HAML. Если вы еще не слышали о HAML, то это не означает, что HAML — это что-то экзотическое, напротив, HAML использует большинство Rails разработчиков, так активно используют, что даже удивились, почему Rails Core Team невключили HAML в Raila 3.1. как шаблонизатор по умолчанию.

Начать работу с HAML совсем просто!

Read the rest of this entry »

Tags: , , ,

Паттерн программирования Observer в Ruby

октября 2, 2011  |  Published in Ruby, STDLIB

Патерн Observer относится к семейству publish/subscribe паттернов программирования. Observer предоставляет механизм для уведомления одним объектом другого при изменении собственного состояния. Объект, который сообщает об изменении своего состояния называется уведомителем или наблюдаемым объектом, а объекты, которые уведомляются об изменении состояния уведомителя называются подписчиками или наблюдателями.
Read the rest of this entry »

Tags: , , , ,

Sinatra: шаблоны, редирект и сессии

сентября 25, 2011  |  Published in Sinatra

Шаблоны
В предыдущей статье мы просто рендерили переменные и строки, но чаще всего это не самый лучший способ представления информации пользователю. Когда мы хотим создать реальный сайт, а не приложение выводящее одну строку — нам необходимо использовать много разметки для данных, которую помещать в блок обработки запроса — неправильно. Sinatra Framework позволяет использовать различные шаблоны благодаря gem Tilt. Возьмем приложение из предыдущей статьи и перепишем его с использованием шаблонов. Все шаблоны будут храниться в поддиректории ./views/. Views — это директория в которой хранятся файлы представлений по умолчанию.

#app.rb
require 'sinatra'
require 'erb'

before do
  @title = "Sinatra Tutorial"
end

get '/' do
  @message = "Welcome to RubyDev.ru"
  erb :index
end
<!--- ./views/index.erb --->
<html>
  <head>
    <title><%= @title %></title>
  </head>
  <body>
    <div id='header'>
      <h1><%= @title %></h1>
    </div>
    <div id='content'>
     <p><%= @message %></p>
    </div>
  </body>
</html>

Read the rest of this entry »

Tags: , ,

RSpec Tutorial: Введение

сентября 18, 2011  |  Published in BDD, RSpec, Тестирование

UPD: Добавлен параграф об around() хуке.

toolkit rspecДоброго времени суток ув. читатель RubyDev’а!
В данный момент автор RubyDev, то есть я, очень похож на белку в колесе ибо он занимается устройством на работу. К сожалению или к великому счастью обязательным условием является умение работать с RSpec, которым автор владеет в совершенстве плохо, по сему, решил я бросить все ресурсы на то, чтобы изучить сие твоение Девида Челимски.

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

Ибо время — деньги, а платить мне никто за это старание не будет, буду совсем краток.
Read the rest of this entry »

Tags: , , ,

Делаем простую пагинацию в Rails 3 ч. 2

августа 24, 2011  |  Published in Ruby on Rails, Ruby on Rails 3

В предыдущей статье мы сделали самую простую пагинацию, которая выводит ссылки на все существующие страницы. В этой статье мы несколько расширим функционал.

 

 

 

Для начала откроем хелпер постов:

#../app/helpers/posts_helper.rb
module PostsHelper
end

В этот хелпер мы поместим весь код отвечающий за представление ссылок пагинации.
Сразу оговорюсь (предсказывая гневные комментарии типа: «Что за говнокод?»), что данная статья не ставит целью описать окончательный вариант разработки пагинации. Рефакторинг, добавление конфигурирования представления ссылок и т.д. будет рассмотрено в следующей статье или статьях. Это пошаговое руководство разработки пагинации, которое показывает не только правильный вариант пагинации, но и попутно демонстрирует распространенные у новичков ошибки.

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

Read the rest of this entry »

Tags: ,

Делаем простую пагинацию в Rails 3 ч. 1

августа 23, 2011  |  Published in Ruby on Rails, Ruby on Rails 3

Для совсем молодых: Пагинация — это разбирие контента на страницы, например у вас есть 1000 статей и выводить их все на одной странице — очень жестоко по отношению к посетителю сайта. Вместо вывода всего содержимого на одной странице, мы разбиваем его на страницы, например по 10 статей на страницу и предоставляем ссылки на другие страницы.

Я отношусь к той когорте людей, что считает, что использование различных гемов для пагинации типа kaminari или will_paginate является лишним, точнее избыточным и не достаточно гибким. Кто-то может бросить в меня камень или помидор со словами: «Необходимо использовать готовые протестированые решения, а не писать свои велосипеды!», и будет прав, но, в случае с пагинацией я не согласен, ибо реализовать пагинацию очень просто. В этой статье я постараюсь привести пример разработки такой пагинации, которая будет удовлетворять вас, в 99% случаев.

Код нашей пагинации состоит из двух основных частей и роутинга:

1. Код выборки — отвечает за выборку записей из БД в соответствии со страницей для которой осуществляется выборка,
2. Код представления — отвечает за представление ссылок на страницы,
3. … и роутинг =)
Read the rest of this entry »

Tags: ,