Estou tentando escrever um plugin jQuery que fornecerá funções / métodos adicionais para o objeto que o chama. Todos os tutoriais que li on-line (navegando nas últimas 2 horas) incluem, no máximo, como adicionar opções, mas não funções adicionais.
Aqui está o que eu estou procurando fazer:
// formata div para ser um contêiner de mensagem chamando o plug-in para essa div
$("#mydiv").messagePlugin();
$("#mydiv").messagePlugin().saySomething("hello");
Ou algo nesse sentido. Aqui está o que se resume a: Eu chamo o plug-in, depois chamo uma função associada a ele. Não consigo encontrar uma maneira de fazer isso, e já vi muitos plugins fazer isso antes.
Aqui está o que eu tenho até agora para o plugin:
jQuery.fn.messagePlugin = function() {
return this.each(function(){
alert(this);
});
//i tried to do this, but it does not seem to work
jQuery.fn.messagePlugin.saySomething = function(message){
$(this).html(message);
}
};
Como posso conseguir algo assim?
Obrigado!
Atualização em 18 de novembro de 2013: Alterei a resposta correta para a dos seguintes comentários e votos positivos de Hari.
fonte
this.data('tooltip', $.extend(true, {}, $.fn.tooltip.defaults, methodOrOptions));
para que agora eu possa acessar as opções sempre que desejar após a inicialização.init
.Aqui está o padrão que eu usei para criar plugins com métodos adicionais. Você usaria como:
ou, para invocar um método diretamente,
Exemplo:
fonte
;
sua primeira linha? por favor me explicar :)E essa abordagem:
Os objetos selecionados são armazenados no fechamento messagePlugin e essa função retorna um objeto que contém as funções associadas ao plug-in, em cada função você pode executar as ações desejadas nos objetos selecionados no momento.
Você pode testar e jogar com o código aqui .
Editar: código atualizado para preservar o poder da capacidade de cadeia do jQuery.
fonte
$('p').messagePlugin()
menos que você chame uma das duas funções que ela retorna.O problema com a resposta atualmente selecionada é que você não está realmente criando uma nova instância do plug-in personalizado para cada elemento do seletor como pensa que está fazendo ... na verdade, está apenas criando uma única instância e transmitindo o próprio seletor como o escopo.
Veja este violino para uma explicação mais profunda.
Em vez disso, você precisará percorrer o seletor usando jQuery.each e instanciar uma nova instância do plug-in personalizado para cada elemento no seletor.
Aqui está como:
E um violino de trabalho .
Você notará como, no primeiro violino, todas as divs são sempre movidas para a direita exatamente o mesmo número de pixels. Isso ocorre porque apenas um objeto de opções existe para todos os elementos no seletor.
Usando a técnica descrita acima, você notará que, no segundo violino, cada div não está alinhada e é movida aleatoriamente (excluindo a primeira div, pois o randomizador é sempre definido como 1 na linha 89). Isso ocorre porque agora estamos instanciando adequadamente uma nova instância de plug-in personalizado para cada elemento no seletor. Cada elemento possui seu próprio objeto de opções e não é salvo no seletor, mas na instância do próprio plug-in customizado.
Isso significa que você poderá acessar os métodos do plug-in personalizado instanciado em um elemento específico no DOM a partir de novos seletores do jQuery e não será forçado a armazená-los, como faria no primeiro violão.
Por exemplo, isso retornaria uma matriz de todos os objetos de opções usando a técnica no segundo violino. Ele retornaria indefinido no primeiro.
É assim que você teria que acessar o objeto de opções no primeiro violino e retornaria apenas um único objeto, não uma matriz deles:
Eu sugiro usar a técnica acima, não a da resposta atualmente selecionada.
fonte
$('.my-elements').find('.first-input').customPlugin('update', 'first value').end().find('.second-input').customPlugin('update', 'second value'); returns Cannot read property 'end' of undefined
. jsfiddle.net/h8v1k2pLO jQuery tornou isso muito mais fácil com a introdução da Widget Factory .
Exemplo:
Inicialização:
Chamada de método:
(É assim que a biblioteca da UI do jQuery é criada.)
fonte
Uma abordagem mais simples é usar funções aninhadas. Em seguida, você pode encadeá-los de maneira orientada a objetos. Exemplo:
E aqui está como chamá-lo:
Tenha cuidado, porém. Você não pode chamar uma função aninhada até que ela tenha sido criada. Então você não pode fazer isso:
A função DoEvenMore nem existe porque a função DoSomething ainda não foi executada, o que é necessário para criar a função DoEvenMore. Para a maioria dos plugins jQuery, você realmente terá apenas um nível de funções aninhadas e não duas, como mostrei aqui.
Apenas certifique-se de que, ao criar funções aninhadas, defina essas funções no início da função pai antes que qualquer outro código na função pai seja executado.
Por fim, observe que o membro "this" é armazenado em uma variável chamada "_this". Para funções aninhadas, você deve retornar "_this" se precisar de uma referência à instância no cliente que está chamando. Você não pode simplesmente retornar "this" na função aninhada porque isso retornará uma referência à função e não à instância do jQuery. O retorno de uma referência do jQuery permite que você encadeie métodos intrínsecos do jQuery no retorno.
fonte
Obtive-o do jQuery Plugin Boilerplate
Também descrito em jQuery Plugin Boilerplate, reprise
fonte
$('.first-input').data('pluginName').publicMethod('new value').css('color', red);
retornaCannot read property 'css' of undefined
jsfiddle.net/h8v1k2pL/1 #return $element
; neste exemplo, você o mudaria paraplugin.foo_public_method = function() {/* Your Code */ return $element;}
@Salim, obrigado por me ajudar ... github.com/AndreaLombardo/BootSideMenu/pull/34Tarde demais, mas talvez possa ajudar alguém um dia.
Eu estava na mesma situação, criando um plug-in jQuery com alguns métodos e, depois de ler alguns artigos e alguns pneus, criei um boilerplate do plug-in jQuery ( https://github.com/acanimal/jQuery-Plugin-Boilerplate ).
Além disso, desenvolvi com ele um plug-in para gerenciar tags ( https://github.com/acanimal/tagger.js ) e escrevi dois posts explicando passo a passo a criação de um plug-in jQuery ( http: // acuriousanimal. com / blog / 2013/01/15 / coisas-eu-aprendi-criando-um-jquery-plugin-parte-i / ).
fonte
Você pode fazer:
Dessa maneira, seu objeto de plug-ins é armazenado como valor de dados em seu elemento.
fonte
Que tal usar gatilhos? Alguém conhece alguma desvantagem em usá-los? O benefício é que todas as variáveis internas são acessíveis através dos gatilhos, e o código é muito simples.
Veja em jsfiddle .
Exemplo de uso
Plugar
fonte
Aqui, quero sugerir etapas para criar um plugin simples com argumentos.
Aqui, adicionamos o objeto padrão chamado
params
e definimos os valores padrão das opções usando aextend
função Portanto, se passarmos o argumento em branco, ele definirá os valores padrão, caso contrário, ele definirá.Leia mais: Como criar o plugin JQuery
fonte
Tente este:
fonte
Aqui está minha versão básica disso. Semelhante aos postados antes, você chamaria como:
-ou acesse a instância diretamente @
plugin_MessagePlugin
MessagePlugin.js
fonte
O seguinte plug-in-estrutura utiliza o jQuery-
data()
-Método para proporcionar uma interface pública para plug-in-métodos / -Configurações internos (preservando jQuery-chainability):Agora você pode chamar métodos de plug-in internos para acessar ou modificar dados do plug-in ou o elemento relevante usando esta sintaxe:
Desde que você retorne o elemento atual (this) de dentro da sua implementação da
myPublicPluginMethod()
jQuery-chainability será preservada - portanto, o seguinte funciona:Aqui estão alguns exemplos (para obter detalhes, confira este violino ):
fonte
Isso pode realmente ser feito para funcionar de uma maneira "agradável" usando
defineProperty
. Onde "nice" significa sem ter que usar()
para obter o namespace do plug-in nem passar o nome da função por string.Nit compatibilidade:
defineProperty
não funciona em navegadores antigos, como o IE8 e abaixo. Advertência:$.fn.color.blue.apply(foo, args)
não vai funcionar, você precisa usarfoo.color.blue.apply(foo, args)
.Link JSFiddle
fonte
De acordo com o padrão jquery, você pode criar um plugin da seguinte forma:
Como chamar este plugin?
Referência: link
fonte
Eu acho que isso pode ajudá-lo ...
No exemplo acima, eu criei um plugin simples de destaque do jquery. Eu havia compartilhado um artigo no qual discuti sobre Como criar seu próprio plugin do jQuery, do básico ao avançado. Eu acho que você deveria dar uma olhada ... http://mycodingtricks.com/jquery/how-to-create-your-own-jquery-plugin/
fonte
A seguir, um pequeno plug-in para ter um método de aviso para fins de depuração. Mantenha esse código no arquivo jquery.debug.js: JS:
HTML:
fonte
Aqui está como eu faço isso:
fonte
O que você fez é basicamente estender o objeto jQuery.fn.messagePlugin pelo novo método. O que é útil, mas não no seu caso.
Você tem que fazer é usar esta técnica
Mas você pode realizar o que deseja, quero dizer que existe uma maneira de fazer $ ("# mydiv"). MessagePlugin (). SaySomething ("olá"); Meu amigo, ele começou a escrever sobre lugins e como estendê-los com sua cadeia de funcionalidades, aqui está o link para o blog dele
fonte