SlideShare une entreprise Scribd logo
1  sur  21
Télécharger pour lire hors ligne
Rozšiřujeme jQuery
aneb proč si nenapsat plugin?


 Bohdan Ganický
 Front-end Web Developer

 http://twitter.com/bganicky
 http://atomicant.co.uk
Co je to jQuery plugin?
Rozšíření standardní sady metod, kterou nám jQuery
dodává ve výchozím stavu


Použití:
$('p').myPlugin();
Základní implementace - $.fn.myPlugin

$.fn.check = function() {
 this.attr('checked', 'checked');
};

$('input:checkbox').check();


Proměnná this je v tomto kontextu jQuery objekt
s veškerou svojí funkcionalitou.

                                          Ukázka
Řetězení – kde se stala chyba?
$('input:checkbox').check().hide(); // ERROR




                                       Ukázka
Řetězení
Pro zachování řetězení metod musíme zevnitř pluginu
vrátit upravený jQuery objekt.

$.fn.check = function() {
 return this.attr('checked', 'checked');
};




                                           Ukázka
Unobfuscate plugin
●   Ze serveru dostaneme obfuskované emailové
    adresy
●   Plugin z nich udělá normální 'mailto:' odkazy
●   Plugin akceptuje různé varianty obfuskace:
    <span>bob[at-sign]mail[dot-sign]xy</span>
    <a href="mailto:bob[at-sign]mail[dot-sign]xy">kontakt</a>
    <a href="mailto:bob[at-sign]mail[dot-sign]xy">bob[at-sign]mail[dot-
      sign]xy</a>
Výchozí stav
$.fn.unobfuscate = function() {
   function gimmeMail(str, at, dot) {
     return str.replace(at, '@', 'g').replace(dot, '.', 'g');
   }

  return this.each(function() {
    var $elemToUnobfuscate = $(this);
    var address = gimmeMail($elemToUnobfuscate.text(), "[at-sign]", "[dot-sign]");

     $elemToUnobfuscate.text(address);

     if ($elemToUnobfuscate.is('a')) {
        $elemToUnobfuscate.attr('href', gimmeMail($elemToUnobfuscate.attr('href'),
"[at-sign]", "[dot-sign]"));
     }
     else {
        $elemToUnobfuscate.html('<a href="mailto:' + address + '">' + address +
'</a>');
     }
   });
};
HTML a inicializace
<ul>
  <li><span class="no-spam">john.doe[at-sign]email[dot-sign]com</span></li>
   <li><a href="mailto:john.doe[at-sign]email[dot-sign]com" class="no-
spam">contact</a></li>
   <li><a href="mailto:joh.doe[at-sign]email[dot-sign]com" class="no-spam">john.doe[at-
sign]email[dot-sign]com</a></li>
</ul>

<script type="text/javascript">
   $('.no-spam').unobfuscate();
</script>




                                                                         Ukázka
Nastavení možností uživatelem
$.fn.unobfuscate = function (userOptions ) {
   ...
   var defaultOptions = {
      atString: '[at-sign]' ,
      dotString: '[dot-sign]'
   }
   var options = $.extend (defaultOptions, userOptions);

   return this .each( function () {
      ...
      var address = gimmeMail($elemToUnobfuscate.text(),   options.atString,
options.dotString );

     $elemToUnobfuscate.text(address);

      if ($elemToUnobfuscate.is('a')) {
         $elemToUnobfuscate.attr('href', gimmeMail($elemToUnobfuscate.attr('href'),
options.atString, options.dotString ));
      }
      else {
         $elemToUnobfuscate.html('<a href="mailto:' + address + '">' + address + '</
a>');
      }
   });
Nastavení možností uživatelem
<ul>
  <li><span class="no-spam">john.doeATemailDOTcom</span></li>
  <li><a href="mailto:john.doeATemailDOTcom" class="no-spam">contact</a></li>
  <li><a href="mailto:john.doeATemailDOTcom" class="no-
spam">john.doeATemailDOTcom</a></li>
</ul>

<script type="text/javascript">
  $('.no-spam').unobfuscate({
     atString: 'AT',
     dotString: 'DOT'
  });
</script>




                                                                        Ukázka
Nastav. výchozích možností uživatelem
$.fn.unobfuscate = function(userOptions) {
   ...
   var options = $.extend({}, $.fn.unobfuscate.defaultOptions, userOptions);

     return this.each(function() {

       ...

     });
};

$.fn.unobfuscate.defaultOptions = {
   atString: '[at-sign]',
   dotString: '[dot-sign]'
};
Nastav. výchozích možností uživatelem
// nastavení všech možností
$.fn.unobfuscate.defaultOptions = {
   atString: 'AT',
   dotString: 'DOT'
};

// nastavení jedné možnosti
$.fn.unobfuscate.defaultOptions.atString = 'AT';

// volání pluginu na domready
$(function() {
   $('.no-spam').unobfuscate();
});




                                                   Ukázka
Uzávěra (closure)
 ●   Umožňuje nastavení privátních funkcí, které se pustí
     pouze jednou při načtení skriptu a následně jsou k
     dispozici pouze uvnitř pluginu.
 ●   Řeší problém s '$' – ne všichni používají stejný alias!
(function($) {
   $.fn.unobfuscate = function(userOptions) {
      function gimmeMail(str, at, dot) {
         ...
      }
      return this.each(function() {
         ...
      });
   };
   ...
})(jQuery);
Privátní prostor
 ●    Uvnitř uzávěry (ale vně pluginu) můžeme definovat
      privátní funkce/proměnné či konstanty, které budou
      k dispozici pouze pro náš plugin a budou definovány
      pouze jednou.

(function($) {
  function gimmeMail(str, at, dot) {
     return str.replace(at, '@', 'g').replace(dot, '.', 'g');
   }

     $.fn.unobfuscate = function(userOptions) {
        ...
     };

   $.fn.unobfuscate.defaultOptions = { ... };
})(jQuery);
Callback funkce
 ●   Dejte uživateli možnost ovlivnit chování pluginu při
     různých událostech.
(function($) {
  ...
  $.fn.unobfuscate = function(userOptions) {
        ...
        options.processed.call(this);
     });
  };

   $.fn.unobfuscate.defaultOptions = {
      atString: '[at-sign]',
      dotString: '[dot-sign]',
      processed: function(){}
   };
})(jQuery);
Callback funkce - použití
$(function() {
   var count = 0;

  $('.no-spam').unobfuscate({
     processed: function() {
       $(this).after(' Zpracováno');
       count++;
     }
  });

   alert('Počet zpracovanych adres: ' + count);
});




                                                  Ukázka
Předejití vícenásobnému zpracování
(function($) {
  ...
  $.fn.unobfuscate = function(userOptions) {
     var options = $.extend({}, $.fn.unobfuscate.defaultOptions, userOptions);
     var that = this.not('.unobfuscated');

     return that.each(function() {
        ...
        $elemToUnobfuscate.addClass('unobfuscated');
        options.processed.call(this);
     });
  };
  ...
})(jQuery);




                                                                        Ukázka
Co ještě?
●   Dokumentace (jsDoc)
●   Komprimace (YUI Compressor,
    Google Closure Compiler)
●   Kooperace (GitHub)
Kam dál?
●   http://docs.jquery.com/Plugins/Authoring
●   http://learningjquery.com
●   http://github.com/malsup
●   http://benalman.com/projects/jquery/
Otázky?
Díky za pozornost!


Bohdan Ganický
Front-end Web Developer

http://twitter.com/bganicky
http://atomicant.co.uk

Contenu connexe

Tendances (6)

Django
DjangoDjango
Django
 
Ajaxujme přátelé
Ajaxujme přáteléAjaxujme přátelé
Ajaxujme přátelé
 
Testování presenterů v Nette
Testování presenterů v NetteTestování presenterů v Nette
Testování presenterů v Nette
 
Doctrine: co dělat, když entity nestačí
Doctrine: co dělat, když entity nestačíDoctrine: co dělat, když entity nestačí
Doctrine: co dělat, když entity nestačí
 
Jak přemigrovat Slevomat na Doctrine za jedno dopoledne
Jak přemigrovat Slevomat na Doctrine za jedno dopoledneJak přemigrovat Slevomat na Doctrine za jedno dopoledne
Jak přemigrovat Slevomat na Doctrine za jedno dopoledne
 
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
 

En vedette

Viral Marketing By Aviroop Banik{Rizvi Institutes of Management Studies,Bandr...
Viral Marketing By Aviroop Banik{Rizvi Institutes of Management Studies,Bandr...Viral Marketing By Aviroop Banik{Rizvi Institutes of Management Studies,Bandr...
Viral Marketing By Aviroop Banik{Rizvi Institutes of Management Studies,Bandr...
Aviroop Banik
 
Der end to der varb
Der end to der varbDer end to der varb
Der end to der varb
ham97
 
eco 1º temas 4,5, 1bach
eco 1º temas 4,5, 1bacheco 1º temas 4,5, 1bach
eco 1º temas 4,5, 1bach
Estrella
 
Dennesb Chapter1 Notes
Dennesb Chapter1 NotesDennesb Chapter1 Notes
Dennesb Chapter1 Notes
dennesb
 
Co-Creation with Customers-By Aviroop Banik,Rizvi Institute of Management Stu...
Co-Creation with Customers-By Aviroop Banik,Rizvi Institute of Management Stu...Co-Creation with Customers-By Aviroop Banik,Rizvi Institute of Management Stu...
Co-Creation with Customers-By Aviroop Banik,Rizvi Institute of Management Stu...
Aviroop Banik
 
Accountancy Day - Troy University
Accountancy Day - Troy UniversityAccountancy Day - Troy University
Accountancy Day - Troy University
Tammy Busby
 
Spring 2009 Known Artists
Spring 2009 Known ArtistsSpring 2009 Known Artists
Spring 2009 Known Artists
koiv
 
World war 2
World war 2World war 2
World war 2
ham97
 
IOTW: Student Exchange Opportunities, by Erlyani Hamid
IOTW: Student Exchange Opportunities, by Erlyani HamidIOTW: Student Exchange Opportunities, by Erlyani Hamid
IOTW: Student Exchange Opportunities, by Erlyani Hamid
MENDAKI Club
 

En vedette (20)

Passionist Observance of Water World Day
Passionist Observance of Water World DayPassionist Observance of Water World Day
Passionist Observance of Water World Day
 
Viral Marketing By Aviroop Banik{Rizvi Institutes of Management Studies,Bandr...
Viral Marketing By Aviroop Banik{Rizvi Institutes of Management Studies,Bandr...Viral Marketing By Aviroop Banik{Rizvi Institutes of Management Studies,Bandr...
Viral Marketing By Aviroop Banik{Rizvi Institutes of Management Studies,Bandr...
 
Corporate lessons
Corporate lessonsCorporate lessons
Corporate lessons
 
Der end to der varb
Der end to der varbDer end to der varb
Der end to der varb
 
eco 1º temas 4,5, 1bach
eco 1º temas 4,5, 1bacheco 1º temas 4,5, 1bach
eco 1º temas 4,5, 1bach
 
Dennesb Chapter1 Notes
Dennesb Chapter1 NotesDennesb Chapter1 Notes
Dennesb Chapter1 Notes
 
Ananth Mohan
Ananth MohanAnanth Mohan
Ananth Mohan
 
Greek mythology 2
Greek mythology 2Greek mythology 2
Greek mythology 2
 
Co-Creation with Customers-By Aviroop Banik,Rizvi Institute of Management Stu...
Co-Creation with Customers-By Aviroop Banik,Rizvi Institute of Management Stu...Co-Creation with Customers-By Aviroop Banik,Rizvi Institute of Management Stu...
Co-Creation with Customers-By Aviroop Banik,Rizvi Institute of Management Stu...
 
Ypf[1]
Ypf[1]Ypf[1]
Ypf[1]
 
Common Thread Technologies
Common Thread TechnologiesCommon Thread Technologies
Common Thread Technologies
 
Accountancy Day - Troy University
Accountancy Day - Troy UniversityAccountancy Day - Troy University
Accountancy Day - Troy University
 
Online Brand Reputation: scenari avanzati di Analisi e Intervento
Online Brand Reputation: scenari avanzati di Analisi e InterventoOnline Brand Reputation: scenari avanzati di Analisi e Intervento
Online Brand Reputation: scenari avanzati di Analisi e Intervento
 
Spring 2009 Known Artists
Spring 2009 Known ArtistsSpring 2009 Known Artists
Spring 2009 Known Artists
 
World war 2
World war 2World war 2
World war 2
 
IOTW: Student Exchange Opportunities, by Erlyani Hamid
IOTW: Student Exchange Opportunities, by Erlyani HamidIOTW: Student Exchange Opportunities, by Erlyani Hamid
IOTW: Student Exchange Opportunities, by Erlyani Hamid
 
J7
J7J7
J7
 
A Five Year Plan V.2
A Five Year Plan V.2A Five Year Plan V.2
A Five Year Plan V.2
 
Studio Guidi S.r.l. - Organizzazione e Consulenza congressuale
Studio Guidi S.r.l. - Organizzazione e Consulenza congressualeStudio Guidi S.r.l. - Organizzazione e Consulenza congressuale
Studio Guidi S.r.l. - Organizzazione e Consulenza congressuale
 
Corporate lessons
Corporate lessonsCorporate lessons
Corporate lessons
 

Similaire à Rozšiřujeme jQuery aneb proč si nenapsat plugin?

Dependency injection v Nette 2.1 prakticky
Dependency injection v Nette 2.1 praktickyDependency injection v Nette 2.1 prakticky
Dependency injection v Nette 2.1 prakticky
Filip Procházka
 

Similaire à Rozšiřujeme jQuery aneb proč si nenapsat plugin? (16)

Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015
Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015
Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015
 
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
 
Petr Heinz - Čisté testy, dobré testy
Petr Heinz - Čisté testy, dobré testyPetr Heinz - Čisté testy, dobré testy
Petr Heinz - Čisté testy, dobré testy
 
ClojureScript
ClojureScriptClojureScript
ClojureScript
 
Clean code
Clean codeClean code
Clean code
 
React premature performance optimization
React premature performance optimizationReact premature performance optimization
React premature performance optimization
 
Czechitas - školení PHP/Symfony MicroKernel
Czechitas - školení PHP/Symfony MicroKernelCzechitas - školení PHP/Symfony MicroKernel
Czechitas - školení PHP/Symfony MicroKernel
 
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
 
Android Development for Phone and Tablet
Android Development for Phone and TabletAndroid Development for Phone and Tablet
Android Development for Phone and Tablet
 
Dependency injection v Nette 2.1 prakticky
Dependency injection v Nette 2.1 praktickyDependency injection v Nette 2.1 prakticky
Dependency injection v Nette 2.1 prakticky
 
Silex
SilexSilex
Silex
 
JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017
 
JavaScript
JavaScriptJavaScript
JavaScript
 
WebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHPWebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHP
 
Scala - jazyk budoucnosti
Scala - jazyk budoucnostiScala - jazyk budoucnosti
Scala - jazyk budoucnosti
 
React z pohledu UI vývojáře
React z pohledu UI vývojářeReact z pohledu UI vývojáře
React z pohledu UI vývojáře
 

Rozšiřujeme jQuery aneb proč si nenapsat plugin?

  • 1. Rozšiřujeme jQuery aneb proč si nenapsat plugin? Bohdan Ganický Front-end Web Developer http://twitter.com/bganicky http://atomicant.co.uk
  • 2. Co je to jQuery plugin? Rozšíření standardní sady metod, kterou nám jQuery dodává ve výchozím stavu Použití: $('p').myPlugin();
  • 3. Základní implementace - $.fn.myPlugin $.fn.check = function() { this.attr('checked', 'checked'); }; $('input:checkbox').check(); Proměnná this je v tomto kontextu jQuery objekt s veškerou svojí funkcionalitou. Ukázka
  • 4. Řetězení – kde se stala chyba? $('input:checkbox').check().hide(); // ERROR Ukázka
  • 5. Řetězení Pro zachování řetězení metod musíme zevnitř pluginu vrátit upravený jQuery objekt. $.fn.check = function() { return this.attr('checked', 'checked'); }; Ukázka
  • 6. Unobfuscate plugin ● Ze serveru dostaneme obfuskované emailové adresy ● Plugin z nich udělá normální 'mailto:' odkazy ● Plugin akceptuje různé varianty obfuskace: <span>bob[at-sign]mail[dot-sign]xy</span> <a href="mailto:bob[at-sign]mail[dot-sign]xy">kontakt</a> <a href="mailto:bob[at-sign]mail[dot-sign]xy">bob[at-sign]mail[dot- sign]xy</a>
  • 7. Výchozí stav $.fn.unobfuscate = function() { function gimmeMail(str, at, dot) { return str.replace(at, '@', 'g').replace(dot, '.', 'g'); } return this.each(function() { var $elemToUnobfuscate = $(this); var address = gimmeMail($elemToUnobfuscate.text(), "[at-sign]", "[dot-sign]"); $elemToUnobfuscate.text(address); if ($elemToUnobfuscate.is('a')) { $elemToUnobfuscate.attr('href', gimmeMail($elemToUnobfuscate.attr('href'), "[at-sign]", "[dot-sign]")); } else { $elemToUnobfuscate.html('<a href="mailto:' + address + '">' + address + '</a>'); } }); };
  • 8. HTML a inicializace <ul> <li><span class="no-spam">john.doe[at-sign]email[dot-sign]com</span></li> <li><a href="mailto:john.doe[at-sign]email[dot-sign]com" class="no- spam">contact</a></li> <li><a href="mailto:joh.doe[at-sign]email[dot-sign]com" class="no-spam">john.doe[at- sign]email[dot-sign]com</a></li> </ul> <script type="text/javascript"> $('.no-spam').unobfuscate(); </script> Ukázka
  • 9. Nastavení možností uživatelem $.fn.unobfuscate = function (userOptions ) { ... var defaultOptions = { atString: '[at-sign]' , dotString: '[dot-sign]' } var options = $.extend (defaultOptions, userOptions); return this .each( function () { ... var address = gimmeMail($elemToUnobfuscate.text(), options.atString, options.dotString ); $elemToUnobfuscate.text(address); if ($elemToUnobfuscate.is('a')) { $elemToUnobfuscate.attr('href', gimmeMail($elemToUnobfuscate.attr('href'), options.atString, options.dotString )); } else { $elemToUnobfuscate.html('<a href="mailto:' + address + '">' + address + '</ a>'); } });
  • 10. Nastavení možností uživatelem <ul> <li><span class="no-spam">john.doeATemailDOTcom</span></li> <li><a href="mailto:john.doeATemailDOTcom" class="no-spam">contact</a></li> <li><a href="mailto:john.doeATemailDOTcom" class="no- spam">john.doeATemailDOTcom</a></li> </ul> <script type="text/javascript"> $('.no-spam').unobfuscate({ atString: 'AT', dotString: 'DOT' }); </script> Ukázka
  • 11. Nastav. výchozích možností uživatelem $.fn.unobfuscate = function(userOptions) { ... var options = $.extend({}, $.fn.unobfuscate.defaultOptions, userOptions); return this.each(function() { ... }); }; $.fn.unobfuscate.defaultOptions = { atString: '[at-sign]', dotString: '[dot-sign]' };
  • 12. Nastav. výchozích možností uživatelem // nastavení všech možností $.fn.unobfuscate.defaultOptions = { atString: 'AT', dotString: 'DOT' }; // nastavení jedné možnosti $.fn.unobfuscate.defaultOptions.atString = 'AT'; // volání pluginu na domready $(function() { $('.no-spam').unobfuscate(); }); Ukázka
  • 13. Uzávěra (closure) ● Umožňuje nastavení privátních funkcí, které se pustí pouze jednou při načtení skriptu a následně jsou k dispozici pouze uvnitř pluginu. ● Řeší problém s '$' – ne všichni používají stejný alias! (function($) { $.fn.unobfuscate = function(userOptions) { function gimmeMail(str, at, dot) { ... } return this.each(function() { ... }); }; ... })(jQuery);
  • 14. Privátní prostor ● Uvnitř uzávěry (ale vně pluginu) můžeme definovat privátní funkce/proměnné či konstanty, které budou k dispozici pouze pro náš plugin a budou definovány pouze jednou. (function($) { function gimmeMail(str, at, dot) { return str.replace(at, '@', 'g').replace(dot, '.', 'g'); } $.fn.unobfuscate = function(userOptions) { ... }; $.fn.unobfuscate.defaultOptions = { ... }; })(jQuery);
  • 15. Callback funkce ● Dejte uživateli možnost ovlivnit chování pluginu při různých událostech. (function($) { ... $.fn.unobfuscate = function(userOptions) { ... options.processed.call(this); }); }; $.fn.unobfuscate.defaultOptions = { atString: '[at-sign]', dotString: '[dot-sign]', processed: function(){} }; })(jQuery);
  • 16. Callback funkce - použití $(function() { var count = 0; $('.no-spam').unobfuscate({ processed: function() { $(this).after(' Zpracováno'); count++; } }); alert('Počet zpracovanych adres: ' + count); }); Ukázka
  • 17. Předejití vícenásobnému zpracování (function($) { ... $.fn.unobfuscate = function(userOptions) { var options = $.extend({}, $.fn.unobfuscate.defaultOptions, userOptions); var that = this.not('.unobfuscated'); return that.each(function() { ... $elemToUnobfuscate.addClass('unobfuscated'); options.processed.call(this); }); }; ... })(jQuery); Ukázka
  • 18. Co ještě? ● Dokumentace (jsDoc) ● Komprimace (YUI Compressor, Google Closure Compiler) ● Kooperace (GitHub)
  • 19. Kam dál? ● http://docs.jquery.com/Plugins/Authoring ● http://learningjquery.com ● http://github.com/malsup ● http://benalman.com/projects/jquery/
  • 21. Díky za pozornost! Bohdan Ganický Front-end Web Developer http://twitter.com/bganicky http://atomicant.co.uk