Пишем расширение для google chrome (часть 2)
22-01-2011Продолжим написание нашего расширения для google chrome, которое начали писать на прошлом "уроке".
В прошлый раз мы сделали "каркас" для нашего расширения и страницу настроек. Подключили JQuery для удобства и научились эти самые настройки со страницы сохранять в локальное хранилище.
В это уроке мы научим наше расширение получать необходимые данные с главной страницы фриланса.
Создадим файл popup.html в корневой папке нашего расширения, который мы ранее указали в файле manifest.json:
Copy Source | Copy HTML
- DOCTYPE html>
- <html>
- <head>
- <link rel="stylesheet" href="img/popup.css" />
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- head>
- <body>
- <div id="main">
- <div id="jobs" class="jobs">
- div>
- <div id="help" class="jobs">
- <a href="#" name="job001" class="new">Новые проектыa><a href="" class="delete" onclick="return false">a>
- <div class="hr">div>
- <a href="#" name="job001" class="">Не просмотренные проектыa><a href="" class="delete" onclick="return false">a>
- <div class="hr">div>
- <a href="#" name="job001" class="clicked">Просмотренные проектыa><a href="" class="delete" onclick="return false">a>
- <div class="hr">div>
- <a href="#" name="job001" class="deleted">Удаленные проектыa>
- <div class="hr">div>
- div>
- Разработка дополнения: <a href="http://cramen.ru">Cramen.rua>
- div>
- body>
- html>
-
Это и есть та страница, которая отображается при клике на иконку нашего расширения. Добавим так же в папку img файл стилей popup.css для нашей новой страницы:
Copy Source | Copy HTML
-
- * {
- margin: 0;
- padding: 0;
- color: inherit;
- font-size: inherit;
- }
-
- body {
- background: #F3F3FF;
- }
-
- #main {
- font-size: 13px;
- color: #456;
- width:500px;
- margin: 5px 20px 5px 5px;
- }
-
- .clear {
- clear:both;
- }
-
- .hr {
- clear:both;
- width: 100%;
- display: block;
- background: #9AB;
- height: 1px;
- border-collapse:collapse;
- }
-
- .jobs .hr:nth-last-child(1)
- {
- background: none;
- }
-
-
- .jobs {
- border: 2px solid #F3F3FF;
- border-radius: 8px;
- background: -webkit-gradient(linear, left top, left bottom, from(#D0D7E4), to(#B3BBD5));
- -webkit-box-shadow: 0px 0px 5px #888F99;
- margin: 0px 0px 10px 0px;
- min-height: 20px;
- padding: 4px 4px;
- }
-
- .jobs a {
- text-decoration: none;
- display: block;
- width: 482px;
- height: 14px;
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left:5px;
- margin-right: -16px;
- float: left;
- overflow: hidden;
- }
-
- .jobs a.todelete {
- background-color: #F7DDD9;
- }
-
- .jobs a:hover {
- background-color: #D9DDF7;
- }
-
- .jobs a.new {
- padding-left:16px;
- width: 471px;
- background-image: url("icon_new.png");
- background-repeat: no-repeat;
- }
-
- .jobs a.clicked {
- color: #889;
- }
-
- .jobs a.deleted {
- color: #99A;
- text-decoration:line-through;
- }
-
- .jobs a.delete {
- margin: 0;
- padding: 0;
- display: block;
- width:16px;
- height:14px;
- border: none;
- background: url("icon_delete.png") no-repeat;
- padding: 0;
- margin: 0;
- }
Не забываем перезагрузить наше расширение. Теперь мы сможем увидеть красивую, но пока не функциональную страницу, появляющуюся при клике на значок расширения.
Подключим в нашу созданную страницу три файла с яваскриптами. Уже скачанный нами JQuery и два новых для нас: sys.js и popup.js:
Copy Source | Copy HTML
- <script type="text/javascript" src="js/jquery.js">script>
- <script type="text/javascript" src="js/sys.js">script>
- <script type="text/javascript" src="js/popup.js">script>
-
И создадим два новых файла. Пока пустыми. В файле sys.js мы определим пару функций для получения контента с главной страницы фриланса методами GET и POST а так же фунции логина, логаута и релогина на сайт:
Copy Source | Copy HTML
-
- var doGet = function(param1,param2)
- {
- $.get('http://www.free-lance.ru/',param1,param2);
- }
-
- var doPost = function(param1,param2)
- {
- $.post('http://www.free-lance.ru/',param1,param2);
- }
-
- var doLogin = function(param1)
- {
- doGet(function(data){
- var logouOutForm = $(data).find("#___logout_frm___").length;
- if (logouOutForm == 0)
- {
- doPost({
action: 'login',
login: localStorage.login,
passwd: localStorage.passwd,
autologin: 1
});
- }
- },param1);
- }
-
- var doLogout = function(param1)
- {
- doPost({
action: 'logout'
},param1);
- }
-
- var doRelogin = function()
- {
- doLogout(doLogin);
- }
Подробно комментировать этот код не имеет смысла. Используются элементарные функции JQuery и уже знакомое нам локальное хранилище браузера google chrome.
И наконец, самая магия! Пишем наш файл popup.js, который и будет выводить нам новые проекты с сайта free-lance.ru:
Copy Source | Copy HTML
- $(function(){
-
-
- //получаем данные с сайта
- doGet(function(data){
-
- var current_count=1;
-
- //проходимся по всем дивам div.project-preview
- $(data).find("div.project-preview").each(function(){
-
- //если мы перебрали больше проектов, чем надо (указывается в настройках страницы конфигурации), то возпращаемся из функции.
- if (current_count>localStorage['proj_count']) return;
- current_count++;
-
- var link = $(this).find("h3>a"); // сама ссылка на проект
- var name = link.attr("name"); //атрибут name
- var href = link.attr("href"); //атрибут href
- var deleteLink = $("").addClass("delete").attr("href","#"); //создаем объект - ссылку для удаления проекта
- var clearDiv = $("
").addClass("hr"); //создаем объект - div для визуального разделения проектов.
-
- var priceTag = $(this).find(".project-budjet nobr"); //получаем цену проекта
-
- //если цена проекта указана, то добавляем ее к названию.
- if (priceTag.length==1)
- {
- link.html(link.html()+" ("+priceTag.html()+")");
- }
-
- $("#jobs").append(link);//добавляем ссылку на всплывающую страницу
- if (!localStorage["deleted_"+name])//если проект не удален, добавляем ссылку на удаление
- {
- $("#jobs").append(deleteLink);
- }
- $("#jobs").append(clearDiv);//добавляем разделитель
-
- //обработчик ссылки удаления
- deleteLink.click(function(){
- link.removeClass("new"); //убираем отметку новой
- link.addClass("deleted"); //метим ссылку, как удаленную
- localStorage["deleted_"+name] = "yes"; //отмечаем, что ссылка удалена
- $(this).remove();
- return false;
- });
-
- //визуальное наведение красоты при наведении на ссылку удаления
- deleteLink.hover(function(){
- link.addClass("todelete");
- },function(){
- link.removeClass("todelete");
- });
-
- //обработчик нажатия на ссылку
- link.click(function(){
- $(this).addClass("clicked"); //метим ссылку, как кликнутую
- localStorage["clicked_"+name] = true; //отмечаем, что кликали уже на эту ссылку
- chrome.tabs.create({"url":"http://www.free-lance.ru"+$(this).attr('href'), "selected":false}); // открываем новый таб с нужной страницей
- return false;
- });
-
- //добавляем класс улаленным ссылкам
- if (localStorage["deleted_"+name])
- {
- link.addClass("deleted");
- return;
- }
-
- //если ссылка не просматривалась, метим ее, как новую
- if (!localStorage["view_"+name])
- {
- link.addClass("new");
- link.click(function(){
- $(this).removeClass("new");
- });
- localStorage["view_"+name] = true;
- }
-
- //если ссылка кликалась, метим ее, как кликнутую
- if (localStorage["clicked_"+name])
- {
- link.addClass("clicked");
- }
-
- });
- });
-
-
- });
Тут я в коде текста прокомментировал некоторые моменты. Думаю, что этого будет достаточно для понимания сути происходящего.
Не забываем опять же перезагрузить расширение.
Итак! У нас все готово, кроме одного. Пока что не происходит логина на сайт с нашими учетными данным. Исправим это. Чуток поправим наш файл manifest.json:
Copy Source | Copy HTML
- {
- "name": "Free-Lance checker by Cramen", // Название расширения
- "version": "2.0", // Номер версии
- "description": "Проверялка новых проектоф на free-lance.ru", // Описание расширения
- "permissions": [
- "tabs", // Разрешить расширению работать с вкладками
- "http://www.free-lance.ru/*" // Разрешить расширению обращаться к указанному адресу
- ],
- "browser_action": { // Элементы браузера
- "default_title": "Free-Lance checker", // Название кнопки
- "default_icon": "img/icon.png", // Иконка для кнопки
- "popup": "popup.html" // Всплывающее окно
- },
- "options_page": "options.html", // Страница настроек
- "background_page": "background.html" // Всплывающее окно
- }
Как видно, мы добавили всего одну строку:
"background_page": "background.html" // Всплывающее окно
Эта строка говорит браузеру о том, что следует использовать в качестве фоновой страницы файл background.html. Этот файл будет загружаться один раз при загрузке расширения. В нем то мы и будем логинится!
Создадим background.html со следующим содержимым:
Copy Source | Copy HTML
- DOCTYPE html>
- <html>
- <head>
- <script type="text/javascript" src="js/jquery.js">script>
- <script type="text/javascript" src="js/sys.js">script>
- <script type="text/javascript" src="js/background.js">script>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- head>
- <body>
- body>
- html>
Тут ничего интересного. Самое интересное происходит в подключаемом background.js:
Copy Source | Copy HTML
- var onSettingsUpdate = function()
- {
- doRelogin();
- alert('Настройки успешно обновлены.');
- }
-
- doLogin();
-
И в нашем файле options.js мы заменим наш alert на следующую строчку:
Copy Source | Copy HTML
- chrome.extension.getBackgroundPage().onSettingsUpdate();
Теперь наше расширение вполне функционально и может информировать нас о новых проектах в удомном для восприятия виде:
Пожалуй, на этом я остановлюсь. Конечно, еще много можно сделать в этом расширении. Например подсвечивать или мигать иконкой, когда появляются новые проекты. Опять же, мигать при появлении новых сообщений и т.д. Но это уже не станет проблемой. Все это делается по аналогии того, что уже сделано, так что оставлю это Вам в качестве домашнего задания ;)
Оставлю три подсказки:
- Для проверки по расписанию (интервал времени мы уже сохранили в настройках нашего расширения) используйте стандартный setTimeout.
- Для изменения иконки используйте chrome.browserAction.setIcon
- Не брезгуйте документацией
Надеюсь, написанное мной было Вам полезным.
Все исходники расширения вы можете скачать в этом архиве.
Приветствую критику и комментарии.
Вернуться в блогОставить комментарий
Warning: count(): Parameter must be an array or an object that implements Countable in /var/www/cramen.ru/library/Zend/Db/Table/Abstract.php on line 1259
Комментарии
Большое спасибо за такой подробный tutorial.
У меня вопрос. Скажите пожалуйста, какой средой разработки пользуетесь (для разработки Gooogle расширений) и какие требуются библиотеки для начала разработки?
Заранее, спасибо за ответ.
Я пользуюсь Eclipse (просто он подсвечивает синтаксис html и javascript). По сути можно пользоваться любым текстовым редактором.
Никаких библиотек не надо. Все, что нужно иметь для разработки расширений google chrome - это сам браузер и любой текстовый редактор.
Антон, большое спасибо, ушёл качать Eclipce и пробовать.
Антон, спасибо за статью!
p.s. У копи/пастящих код из статьи могут возникнуть трудности, в листингах *.html файлов "съедены" закрывающие теги.
Да, есть проблема с тегами. Парсер tinyMCE съедает.
Позже исправлю, пока времени нету ))
Добрый день.
Считаю ваше приложение очень полезным и попытался его установить. Но не получается через него подключиться. Скажите, исходники актуальны на данный момент?
Нет, на данный момент исходники не актуальны. На сайте фриланса изменился исходный код страницы и нужно изменять функции логина/выхода