# 28: Construindo um plug-in mais complexo - CSS-Tricks

Anonim

Agora que entendemos os fundamentos do desenvolvimento de plug-ins, podemos nos aprofundar um pouco mais. Como, em última análise, um plugin é uma função, ele nos fornece o escopo que precisamos organizar. Lembra quando colocamos nossa casa em ordem quando estávamos aprendendo sobre modelagem? Podemos usar alguns desses mesmos conceitos em um plugin.

Mas, primeiro, acho que a arquitetura do plugin jQuery pode se beneficiar de algum código clichê. Talvez você esteja familiarizado com o HTML5 Boilerplate, que fornece vários padrões inteligentes. Um boilerplate do plugin jQuery é o mesmo tipo de coisa. Economiza um pouco de digitação e leva você a um caminho de desenvolvimento inteligente.

Me deparei com um projeto literalmente chamado jQuery Boilerplate, que eu acho que é bom. Mas eu não cavei muito nisso. Em vez disso, gosto bastante de Starter de Doug Neiner. Você fornece um nome, alguns padrões e algumas opções e isso irá gerar essa estrutura clichê para você.

Decidimos fazer um controle deslizante denominado lodgeSlider com um parâmetro de velocidade simples e terminar com este código:

(function($)( $.lodgeSlider = function(el, options)( // To avoid scope issues, use 'base' instead of 'this' // to reference this class from internal events and functions. var base = this; // Access to jQuery and DOM versions of element base.$el = $(el); base.el = el; // Add a reverse reference to the DOM object base.$el.data("lodgeSlider", base); base.init = function()( base.options = $.extend((),$.lodgeSlider.defaultOptions, options); // Put your initialization code here ); // Sample Function, Uncomment to use // base.functionName = function(paramaters)( // // ); // Run initializer base.init(); ); $.lodgeSlider.defaultOptions = ( speed: 300 ); $.fn.lodgeSlider = function(options)( return this.each(function()( (new $.lodgeSlider(this, options)); )); ); ))(jQuery);

Muito disso deve parecer familiar. Existe um IIFE envolvendo o plugin para segurança. Existe uma função criada a partir do objeto jQuery. Existe uma função init chamada imediatamente. Existe um método criado a partir do objeto jQuery que retorna um objeto jQuery. Existem variáveis ​​criadas com referências de cache que provavelmente usaremos novamente. Principalmente coisas que vimos antes.

Talvez duas coisas novas. Um é o objeto de opções lá. Você pode ver o valor 300 codificado. Mas também veja a linha com $.extend(). Essa é uma função jQuery para combinar dois objetos em um, com um tendo precedência sobre o outro. Quando chamamos o plugin, talvez assim:

$("#slider-1").lodgeslider();

Não estamos transmitindo opções e esse objeto vazio é combinado com nosso objeto embutido em código, e os valores padrão estão disponíveis dentro do plug-in. Mas poderíamos chamá-lo assim também:

$("#slider-1").lodgeslider(( speed: 500 ));

Estamos passando um objeto como parâmetro ali. Esse objeto é combinado com nosso objeto embutido em código, tem precedência e o valor que passamos se torna o valor disponível no plugin. Muito legal.

A outra coisa nova é aquela parte estranha com .data(). Criamos a variável base para fazer referência à própria função, que é criada novamente para cada elemento que o plugin é chamado. Por exemplo, digamos que ativamos o plug-in $(".slider")- pode haver dois elementos na página com o nome de classe slider. Cada loop é executado e duas instâncias da função lodgeSlider são feitas. Em cada um, anexamos uma referência a ele ao próprio elemento. Dessa forma, podemos chamar métodos de plugin internos a partir de qualquer referência que tivermos desse elemento.

Como talvez:

$(".the-first-slider").data("lodgeSlider").changeSlide(2);

Apenas nos dá uma boa maneira de usar métodos de plug-in, se necessário.

Não fomos muito longe nesta aventura de construção de plug-in:

Veja a Caneta Construindo um Slider a partir do zero, de Chris Coyier (@chriscoyier) no CodePen

Honestamente, o mundo provavelmente não precisa de outro plugin de controle deslizante. Mas você pode ver como eles podem ficar complexos. Estas são apenas algumas idéias:

  • Pode haver funções de retorno de chamada (ou eventos personalizados) para antes e depois das alterações do slide, depois que o controle deslizante é configurado, depois de ser derrubado, etc.
  • As larguras podem ser baseadas em porcentagem e recalcular quando a janela do navegador muda.
  • A navegação pode ser construída dinamicamente em vez de ser exigida na marcação.
  • Os IDs e #hash hrefs também podem ser criados dinamicamente.
  • Eventos de toque, como deslizar o dedo, podem ser adicionados para tornar o controle deslizante mais amigável (pequenos pontos não são amigáveis ​​ao toque).

Quanto mais dessas coisas você fizer, maior será o tamanho do plugin. É por isso que atingir esse equilíbrio entre recursos, praticidade, desempenho e tamanho é tão complicado e onde existem tantos plug-ins diferentes que, em última análise, fazem a mesma coisa.