Показаны сообщения с ярлыком javascript. Показать все сообщения
Показаны сообщения с ярлыком javascript. Показать все сообщения

9 августа 2012 г.

Велосипеды на Javascript и jQuery

Интересная статья с habra. Полезно знать каждому.

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

http://habrahabr.ru/post/149237/

22 июня 2011 г.

Как создать свой плагин для Firefox

Задача: Разобраться как создавать плагины (дополнения) для Firefox.

Для начала заходим на Add-on Developer Hub и посредством формы создаем простой плагин (будем использовать его как болванку для разработки своего плагина). В качестве уникального ID можно указать собственный e-mail или что-то вроде того.

Скачав сгенерированный код сразу можно его проверить, для этого достаточно переименовать .zip на .xpi и установить как обычное расширение к Firefox (Меню > Инструменты Дополнения, в открытом окне Файл Установить расширения).


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


./chrome
      /content
           about.xul
           ff-overlay.js
           ff-overlay.xul
           options.xul
           overlay.js
      /locale
      /en-US
            about.dtd
            options.dtd
            overlay.dtd
            overlay.properties
      /skin
            overlay.css
            toolbat-button.png
./defaults/
      /preferences
            prefs.js

chrome.manifest
install.rdf


Начнем с файла chrome.manifest. Этот файл отвечает за привязку дополнительных объектов к базовым объектам Firefox. К примеру, базовый объект браузера описан в файле chrome://browser/content/browser.xul, для того чтобы иметь возможность использовать свои обработчики для событий браузера нам необходимо создать свой объект. В файле chrome.manifest происходит наложение (overlay) нового объекта на базовому:

overlay chrome://browser/content/browser.xul chrome://HelloWorld/content/ff-overlay.xul

Файл ff-overlay.xul имеет формат XUL (XML User Interface Language), другими словами это специфический XML-файл. В нашем случае он имеет следующий начальный вид:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="chrome://HelloWorld/skin/overlay.css" type="text/css"?>
<!DOCTYPE overlay SYSTEM "chrome://HelloWorld/locale/overlay.dtd">
<overlay id="HelloWorld-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <script src="overlay.js"/>
  <script src="ff-overlay.js"/>

  <stringbundleset id="stringbundleset">
    <stringbundle id="HelloWorld-strings" src="chrome://HelloWorld/locale/overlay.properties"/>
  </stringbundleset>

  <menupopup id="menu_ToolsPopup">
    <menuitem id="HelloWorld-hello" label="&HelloWorld.label;"
              oncommand="HelloWorld.onMenuItemCommand(event);"/>
  </menupopup>

  <popup id="contentAreaContextMenu">
    <menuitem id="context-HelloWorld" label="&HelloWorldContext.label;"
              accesskey="&HelloWorldContext.accesskey;"
              insertafter="context-stop"
              oncommand="HelloWorld.onMenuItemCommand(event)"/>
  </popup>

  <toolbarpalette id="BrowserToolbarPalette">
  <toolbarbutton id="HelloWorld-toolbar-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
    label="&HelloWorldToolbarButton.label;" tooltiptext="&HelloWorldToolbarButton.tooltip;"
    oncommand="HelloWorld.onToolbarButtonCommand()"/>
  </toolbarpalette>

</overlay>


Заглянем в файлик overlay.js.

var HelloWorld = {

    onLoad: function() {
        // initialization code
        this.initialized = true;
        this.strings = document.getElementById("HelloWorld-strings");
    },

    onMenuItemCommand: function(e) {
        var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
        .getService(Components.interfaces.nsIPromptService);
        promptService.alert(window, this.strings.getString("helloMessageTitle"),
        this.strings.getString("helloMessage"));
    },

    onToolbarButtonCommand: function(e) {
        // just reuse the function above.  you can change this, obviously!
        HelloWorld.onMenuItemCommand(e);
    }
};

window.addEventListener("load", function () { HelloWorld.onLoad(); }, false);

В этом файле находится сгенерированный класс (HelloWorld) для обработки определенных событий. Для инициализации "прослушивания" обработчиков используется метод DOM объекта Window addEventListener().

Событие "load" возникает при загрузке нового окна браузера. Согласно нашему коду, этому событию будет отвечать метод  onLoad класса HelloWorld.

Создадим новый метод, который будет обрабатывать все открываемые браузером страницы и заменять их содержание на предложение "Hello World!".

onPageLoad: function(aEvent) {
   var doc = aEvent.originalTarget;
   // doc - документ, на котором произошло событие "onload"
   doc.body.innerHTML = "Hello World!";
}

К методу OnLoad добавим код, который будет "перехватывать" событие, отвечающее за загрузку страниц в окне браузера (DOMContentLoaded) и вызывать созданный нами метод:

var appcontent = document.getElementById("appcontent");   // browser
if(appcontent)
   appcontent.addEventListener("DOMContentLoaded", HelloWorld.onPageLoad, true);

Получился следующий скрипт:

var HelloWorld = {
    onLoad: function() {
        // initialization code
        this.initialized = true;
        this.strings = document.getElementById("HelloWorld-strings");

        var appcontent = document.getElementById("appcontent");   // browser
        if(appcontent)
            appcontent.addEventListener("DOMContentLoaded", HelloWorld.onPageLoad, true);
    },

    onMenuItemCommand: function(e) {
      // ...
    },

    onToolbarButtonCommand: function(e) {
        // ...
    },

    onPageLoad: function(aEvent) {
        var doc = aEvent.originalTarget;
       // doc - документ, на котором произошло событие "onload"
        doc.body.innerHTML = "Hello World!";
    }
};

window.addEventListener("load", function () { HelloWorld.onLoad(); }, false);

Теперь можем запаковать измененный код в zip-архив, поменять расширения файла на .xpi, и попробовать установить как дополнение в Firefox (см. више).

Результат работы плагина HelloWorld:



Разберемся как работают настройки плагина.

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

Все параметры настройки плагина описаны в файле /defaults/preferences/prefs.js. Для того чтобы добавить новый параметр достаточно прописать в этом файле следующую строчку:

pref("extensions.HelloWorld.counter",0);

Теперь добавим к нашему методу onLoad объекта HelloWorld код для работы с созданным параметром настройки:

    onLoad: function() {
        // initialization code
        this.initialized = true;
        this.strings = document.getElementById("HelloWorld-strings");

        //находим компонент настроек и получаем доступ к узловой ветке
        var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
        //подключаемся к ветке нашего плагина
        prefs = prefs.getBranch("extensions.HelloWorld.");

        //получение значения параметра counter
        counter = prefs.getIntPref("counter");
        counter = counter+1;
       //сохранение нового значения параметра
        prefs.setIntPref("counter",counter);
       
         alert("Вы открываете Фаерфокс уже в "+counter+" раз!");    
    }

Подробнее о методах и функциях для работы с настройками можно почитать на странице nsIPrefBranch - MDC Doc.

В результате при каждом запуске Firefox или открытии нового окна будет отображаться диалог с количеством просмотров.




Полезные ссылки по теме:

  1. DOM Window Object methods
  2. Code snippets - MDC Doc
  3. nsIPrefBranch - MDC Doc



25 мая 2011 г.

jQuery UI: Проблема отображения Datepicker в Dialog

Пытаясь встроить поле для даты, используя плагин Datepicker, в диалоговое окно, создаваемое плагином Dialog библиотеки jQuery UI обнаружил проблему. После открытия диалогового окна и выбора поля Datepicker - панель для выбора даты (календарик) отображается позади диалогового окна.

Решить данную проблему можно следующим образом: в CSS файле со стилями для Datepicker находим стиль для класа  .ui-datepicker  и заменяем его на следующий

.ui-datepicker { 
   width: 17em; 
   padding: .2em .2em 0; 
   z-index: 9999 !important; 
}

27 апреля 2011 г.

Как установить SexyBookmarks на свой сайт?



SexyBookmarks - очень удобный плагин для Wordpress, который позволяет пользователям делится закладками на страницы вашего сайта.

В данной заметке будет описано как установить SexyBookmarks на произвольный сайт, используя только Javascript.

Итак, для начала необходимо скачать и распаковать последнюю версию плагина.

Из всего архива нам понадобятся только несколько файлов:

  • js/sexy-bookmarks-public.js
  • css/style.css
  • images/shr-sprite.png
Далее, подключаем скрипт и файл стилей, перед тегом </head> добавляем следующие строчки кода:

<link rel="stylesheet" type="text/css" href="css/style.css" />
 <script type="text/javascript" src="js/sexy-bookmarks-public.js"></script>

Выбираем подходящее место на странице для размещения кнопок и добавляем следующий HTML-код:
<div class="shr-bookmarks shr-bookmarks-center shr-bookmarks-bg-sexy">
    <ul class="socials">
        <li class="shr-linkedin">
            <a class="external" title="Add this to Linkedin" rel="nofollow" href="http://www.linkedin.com" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','www.linkedin.com']);">Add this to LinkedIn</a>
        </li>
        <li class="shr-twitter">
            <a class="external" title="Tweet This!" rel="nofollow" href="http://twitter.com/home" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','twitter.com']);">Tweet This!</a>
        </li>
        <li class="shr-facebook">
            <a class="external" title="Share this on Facebook" rel="nofollow" href="http://www.facebook.com/share.php" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','www.facebook.com']);">Share this on Facebook</a>
        </li>
        <li class="shr-googlebuzz">
            <a class="external" title="Share this on Google Buzz" rel="nofollow" href="http://www.google.com/buzz/post" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','www.facebook.com']);">Share this on Facebook</a>
        </li>
        <li class="shr-digg">
            <a class="external" title="Digg this!" rel="nofollow" href="http://digg.com/submit" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','digg.com']);">Digg this!</a>
        </li>
        <li class="shr-reddit">
            <a class="external" title="Share this on Reddit" rel="nofollow" href="http://reddit.com/submit" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','reddit.com']);">Share this on Reddit</a>
        </li>
        <li class="shr-delicious">
            <a class="external" title="Share this on del.icio.us" rel="nofollow" href="http://del.icio.us/post" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','del.icio.us']);">Share this on del.icio.us</a>
        </li>
        <li class="shr-stumbleupon">
            <a class="external" title="Stumble upon something good? Share it on StumbleUpon" rel="nofollow" href="http://www.stumbleupon.com/submit" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','www.stumbleupon.com']);">Stumble upon something good? Share it on StumbleUpon</a>
        </li>
        <li class="shr-twittley">
            <a class="external" title="Submit this to Twittley" rel="nofollow" href="http://twittley.com/submit/" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','twittley.com']);">Submit this to Twittley</a>
        </li>
        <li class="shr-googlebookmarks">
            <a class="external" title="Add this to Google Bookmarks" rel="nofollow" href="http://www.google.com/bookmarks/mark" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','www.google.com']);">Add this to Google Bookmarks</a>
        </li>
        <li class="shr-gmail">
            <a class="external" title="Share this with Gmail" rel="nofollow" href="https://mail.google.com/mail/" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','www.google.com']);">Add this to Google Bookmarks</a>
        </li>
        <li class="shr-technorati">
            <a class="external" title="Share this on Technorati" rel="nofollow" href="http://technorati.com/faves" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','technorati.com']);">Share this on Technorati</a>
        </li>
        <li class="shr-diigo">
            <a href="http://www.diigo.com/post" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','www.diigo.com']);">Post this on Diigo</a>
        </li>
        <li class="shr-blinklist">
            <a class="external" title="Share this on Blinklist" rel="nofollow" href="http://www.blinklist.com/index.php" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','www.blinklist.com']);">Share this on Blinklist</a>
        </li>
        <li class="shr-mixx">
            <a class="external" title="Share this on Mixx" rel="nofollow" href="http://www.mixx.com/submit" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','www.mixx.com']);">Share this on Mixx</a>
        </li>
        <li class="shr-newsvine">
            <a class="external" title="Seed this on Newsvine" rel="nofollow" href="http://www.newsvine.com/_tools/seed&amp;save" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','www.newsvine.com']);">Seed this on Newsvine</a>
        </li>
        <li class="shr-yahoobuzz">
            <a class="external" title="Buzz up!" rel="nofollow" href="http://buzz.yahoo.com/submit/" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','buzz.yahoo.com']);">Buzz up!</a>
        </li>
    </ul>
</div>

Осталось немного поправить Javascript. Открываем файл js/sexy-bookmarks-public.js и внутри обработчика jQuery(document).ready(function () {}) добавляем следующий код, для обработки событий, вызываемых при нажатии на каждую кнопку:

jQuery('.shr-bookmarks a.external').click(function() {

var url = encodeURIComponent(window.location.href), desc = '';

var title = document.title;
var description = $("meta[name=description]").attr("content");

switch(this.parentNode.className) {
    case 'shr-twitter':
        this.href += '?status=' + title + '+-+' + url;
        break;
    case 'shr-linkedin':
        this.href += 'shareArticle?mini=true&url='+url+'&title='+title+'&summary='+description+'&source=CEEOA';
        break;
    case 'shr-facebook':
        this.href += '?t=' + title + '&u=' + url;
        break;
    case 'shr-googlebuzz':
        this.href += '?message='+title+'%0A'+description+'&url=' +url;
        break;
    case 'shr-digg':
        this.href += '?phase=2&title=' + title + '&url=' + url + '&desc=' + description;
        break;
    case 'shr-reddit':
        this.href += '?title=' + title + '&url=' + url;
        break;
    case 'shr-delicious':
        this.href += '?title=' + title + '&url=' + url;
        break;
    case 'shr-stumbleupon':
        this.href += '?title=' + title + '&url=' + url;
        break;
    case 'shr-twittley':
        this.href += '?title=' + title + '&url=' + url + '&desc=' + description + '&pcat=Internet&tags=';
        break;
    case 'shr-googlebookmarks':
        this.href += '?op=add&title=' + title +'&desc='+description+ '&bkmk=' + url;
        break;
    case 'shr-gmail':
        this.href += '?view=cm&tf=0&to=&su='+title+'&body='+description+'%0A%0A'+url+'&fs=1';
        break;
    case 'sexy-technorati':
        this.href += '?add=' + url;
        break;
    case 'shr-diigo':
        this.href += '?title=' + title + '&url=' + url + '&desc=' + description;
        break;
    case 'shr-blinklist':
        this.href += '?Action=Blink/addblink.php&Title=' + title + '&Url=' + url;
        break;
    case 'shr-mixx':
        this.href += '?title=' + title + '&page_url=' + url + '&desc=' + description;
        break;
    case 'shr-newsvine':
        this.href += '?h=' + title + '&u=' + url;
        break;
    case 'shr-yahoobuzz':
            this.href += '?submitHeadline=' + title + '&submitUrl=' + url + '&submitSummary=' + description + '&submitCategory=science&submitAssetType=text';
            break;
}
});

Результат:

Как установить SexyBookmarks на свой сайт?

SexyBookmarks - очень удобный плагин для Wordpress, который позволяет пользователям делится закладками на страницы вашего сайта.

В данной заметке будет описано как установить SexyBookmarks на произвольный сайт, используя только Javascript.

Итак, для начала необходимо скачать и распаковать последнюю версию плагина, который находится по адресу http://wordpress.org/extend/plugins/sexybookmarks/stats/.
Из всего архива нам понадобятся только несколько файлов:

  • js/sexy-bookmarks-public.js
  • css/style.css
  • images/shr-sprite.png
Далее, подключаем скрипт и файл стилей, перед тегом </head> добавляюм следующие строчки кода:

<link rel="stylesheet" type="text/css" href="css/style.css" />
<script type="text/javascript" src="js/sexy-bookmarks-public.js"></script>


Выбираем место для размещения кнопок и добавляем HTML-код:

<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center shr-bookmarks-bg-sexy">
    <ul class="socials">
        <li class="shr-linkedin">
            <a class="external" title="Add this to Google Bookmarks" rel="nofollow" href="http://www.linkedin.com" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','www.linkedin.com']);">Add this to LinkedIn</a>
        </li>
        <li class="shr-twitter">
            <a class="external" title="Tweet This!" rel="nofollow" href="http://twitter.com/home" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','twitter.com']);">Tweet This!</a>
        </li>
    </ul>
</div>



7 декабря 2010 г.

Свойство формы target="_blank" и Google Chrome (Safari)

Столкнулся с необычной проблемой.
Пытаясь отправить форму в новом окне средствами javascript в Chrome (Safari) данная операция выполняется только один раз, после чего форму невозможно отправить даже в текущее окно (фрейм).

Как оказалось это баг самого Chrome. Решить ситуацию возможно по средствам создания уникального экшина (action) формы.

Например, используя библиотеку jQuery можно придумать что-то вроде:

$('#form').attr('action','index.php?'+Math.random()*1000).submit();

30 ноября 2010 г.