+ All Categories
Home > Technology > Rozšiřujeme jQuery aneb proč si nenapsat plugin?

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

Date post: 13-Jul-2015
Category:
Upload: bohdan-ganicky
View: 2,283 times
Download: 0 times
Share this document with a friend
21
Rozšiřujeme jQuery aneb proč si nenapsat plugin? Bohdan Ganický Front-end Web Developer http://twitter.com/bganicky http://atomicant.co.uk
Transcript
Page 1: Rozšiřujeme jQuery aneb proč si nenapsat plugin?

Rozšiřujeme jQueryaneb proč si nenapsat plugin?

Bohdan GanickýFront-end Web Developer

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

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

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();

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

Základní implementace - $.fn.myPlugin

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

};

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

Ukázka

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

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

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

Ukázka

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

Řetězení

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

};

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

Ukázka

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

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>

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

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>');

}});

};

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

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

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

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>');

}});

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

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

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

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]'

};

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

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

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

Uzávěra (closure)

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

function gimmeMail(str, at, dot) {...

}return this.each(function() {

...});

};...

})(jQuery);

● 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!

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

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);

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

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);

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

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

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

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

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

Co ještě?

● Dokumentace (jsDoc)● Komprimace (YUI Compressor,

Google Closure Compiler)● Kooperace (GitHub)

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

Kam dál?

● http://docs.jquery.com/Plugins/Authoring● http://learningjquery.com● http://github.com/malsup● http://benalman.com/projects/jquery/

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

Otázky?

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

Díky za pozornost!

Bohdan GanickýFront-end Web Developer

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


Recommended