Ключови информационни индикатори на сайтове за Firefox набързо
Целта на тази статия не е да обяснява как да работите с персонализирани бутони: връзката предоставя достатъчно връзки към документация и форуми. Всичко обаче е подредено доста просто: създава се бутон чрез контекстното меню на лентата с инструменти, въвежда се код в диалоговия прозорец на новия бутон, избират се някои допълнителни екстри, след което бутонът се плъзга към всяка удобна лента с инструменти - и вече е готов за работа (между другото, разширението въвежда допълнителен custombutton:// протокол - позволява лесно да публикувате бутони в мрежата и да ги споделяте по същия начин, както използваме обикновени връзки или отметки).
Ще се опитам да споделя някои кодови рецепти, посветени на споменатите индикатори. Нека преминем от прости към по-сложни. Примерният код трябва да работи във Firefox от версия 12. Наясно съм, че други елементи от кода може да изглеждат глупави на различни хора по различни начини, но примерите не претендират за съвършенство: споделям само ежедневен опит с използване на аматьорски код и искрено се извинявам, че не мога да го направя по-добре.
1. Проста заявка за информация.
Например, нека вземем един не твърде примамлив, но прост и поразителен случай. Нека поискаме текущия брой статии в английската Уикипедия (който сега наближава четири милиона). За да направите това, в първия раздел на диалоговия прозорец за създаване на бутон вмъкнете следния код (разделът се нарича „Код“):
В бъдеще, за различен сайт и друга информация, ще трябва да променим само няколко реда. Нека се опитаме да разберем какво прави кодът.
Кодът на бутона се изпълнява чрез new Function(), така че няма нужда по някакъв начин да се защитава срещу намеса в пространството на имената на браузъра.
След това присвояваме бъдеща променлива на бутона, който първо е представен катотова. И нека да преминем към две подфункции: едната от тях ще получи кода на документа, втората ще го анализира и ще даде необходимата информация.
В резултат на това имаме няколко резултата от заявката: първото успешно извикване (с аргумента pureXHR == true) с директно извличане на DOM води до извикване на функцията за анализиране на документа, първото изчакване води до рекурсивна повторна заявка на чистия код (с аргумента pureXHR == false), последвано от преобразуване в DOM и отново извикване на функцията за анализиране на документ, второто изчакване или грешка в комуникацията води до съответните съобщения за неуспех.
Това е лесен начин за пестеливо търсене на информация в 50 реда код и промяна. Сега нека се опитаме да обогатим малко инструмента.
2. Индикатори за новини с проверки на таймера.
Като пример, нека вземем личните съобщения на уебсайта rutracker.org. Разширението ще провери страницата с лични съобщения (можете да използвате всяка друга, ще се интересуваме от заглавката, която е обща за повечето страници; просто страницата с лични съобщения може да бъде най-икономичният вариант), потърсете желания елемент, проверете свойствата му и докладвайте за състоянието, като промените иконата на бутона и, в допълнение, подсказка (можете да добавите звуково известие или изскачащ прозорец над тавата, но в тази статия няма да говорим за такива трудности).
В този пример леко ще променим принципа на действие: ще се нуждаем не от първия, а от втория раздел на диалоговия прозорец за създаване на бутон. Кодът в този раздел не се изпълнява при натискане на бутона, а веднага след стартиране на браузъра. Това ни дава възможност да зададем необходимите променливи и функции за цялото време на заявките на таймера, както и да зададем манипулатори за различни кликвания на бутони за по-голяма гъвкавост и удобство. Освен това ще анализираме само промените в кода в сравнение с първата опция.
На двойкаДобавени са още два първоначални параметъра: забавяне (броят секунди между стартирането на браузъра и първата заявка на таймера) и интервал (интервали между следващите заявки в минути). В нашия пример това са съответно десет секунди и час.
Сега имаме не две, а четири икони: индикатор за текуща заявка, индикатори за наличие на новини и липса на отсъствие, както и икона за грешки.
Ние също така създаваме специална променлива за обекта за безопасност DOMParser, така че да не се налага да го създаваме отново при всяка заявка.
След това добавяме манипулатор за щракване на мишката. За нас ще бъде достатъчно да натиснем левия и средния бутон на мишката. При първото щракване ще инициираме заявка извън реда (и таймерът ще се рестартира), при натискане на средния бутон ще отворим желаната страница в браузъра, за да прочетем по-подробно новините. Манипулаторът на средния бутон ще провери текущия раздел и ако е празен и нищо не е започнало да се зарежда в него, ще отвори страницата в него, в противен случай - в нов раздел. Освен това с това отваряне ще рестартираме таймера и ще нулираме индикатора за новини до следващата заявка, което означава, че отварянето на страницата е равно на заявка извън реда и пак ще доведе до четене (т.е. нулиране) на новините на сайта.
Обработчиците на XHR резултати в този пример не издават предупреждения, а промени в иконите и подсказките (последните включват часа на заявката и обобщение на резултата).
След като дефинираме променливите и функциите, свързваме манипулатора на щракване с бутона, извикваме първата отложена заявка и стартираме таймера.
Между другото, в Custom Buttons има малък бъг с манипулатори на събития: ако не добавите премахването на манипулатора чрез onDestroy, манипулаторитесе наслояват (дублират) всеки път, когато извиквате персонализирането на лентата с инструменти (отваряне и затваряне на палитрата с инструменти).
3. Индикатори за новини с проверки на таймера и запазване на състояния между сесиите на браузъра.
Сега относно допълненията в кода.
Както виждаме, добавени са променливи за някои вътрешни механизми: всички те ще ни бъдат полезни за запазване на данни между сесиите. Ще използваме същата база данни с настройки като разширенията (няма да използваме помощта на прости файлове или бази данни, за да избегнем ненужната сложност). Избрахме най-универсалния начин за съхраняване на низови данни (***ComplexValue), така че ако е необходимо, можете да съхранявате Unicode в базата данни.
Инструкциите за нулиране на флага за новини са добавени към манипулатора за щракване на бутона (бутонът изисква ключ от настройките, превръща го в обект чрез JSON, променя флага, пакетира обекта в низ и го записва отново в базата данни с настройки).
След като дефинираме променливи и функции и преди да обвържем манипулатори, отложени повиквания и стартиране на таймера, трябва да направим още едно нещо: да проверим дали има ключ в базата данни с настройки за съхраняване на нашите данни. Ако инициализирането на бутона се стартира за първи път (току-що създадохме бутона), все още няма ключ и след това създаваме обект за мъниче с празни стойности на параметри и неактивен флаг за новини.
Примерите могат да бъдат разширени, ако е необходимо: усложняване на известията за новини, добавяне на ключови елементи и параметри за сравнение, създаване на нови детайли на интерфейса в движение (например панели с динамична текстова информация до бутон) и т.н. Можете да прочетете за всичко това на уебсайта за разработчици на Firefox или да надникнете в примерите за готови бутони на уебсайта за разработчици Custom Buttons.
Благодаря тина всеки, който го е чел. И успех в експериментите!
Hardcore conf в C++. Каним само професионалисти.