Dicas e truques do jQuery

507

Sintaxe

Armazenamento de dados

Otimização

Diversos

roosteronacid
fonte

Respostas:

252

Criando um elemento HTML e mantendo uma referência

var newDiv = $("<div />");

newDiv.attr("id", "myNewDiv").appendTo("body");

/* Now whenever I want to append the new div I created, 
   I can just reference it from the "newDiv" variable */


Verificando se existe um elemento

if ($("#someDiv").length)
{
    // It exists...
}


Escrevendo seus próprios seletores

$.extend($.expr[":"], {
    over100pixels: function (e)
    {
        return $(e).height() > 100;
    }
});

$(".box:over100pixels").click(function ()
{
    alert("The element you clicked is over 100 pixels height");
});
Andreas Grech
fonte
93
Escrever seus próprios seletores é muito escorregadio
Hugoware
22
Além disso, se é de alguma ajuda, você pode realmente fazer $ ( "<div />") e alcançar a mesma coisa que $ ( "<div> </ div>")
Hugoware
4
Eu amo a nova parte do seletor, não sabia disso.
Pim Jager
5
Como ainda não consigo editar os wikis da comunidade: Combine a atribuição e a verificação de existência comif ((var someDiv = $("#someDiv")).length) { /* do stuff with someDiv... */ }
Ben Blank
4
@ Ben: A razão de eu evitar expressões idiomáticas no JavaScript é porque não quero dar a ilusão de someDivter um escopo definido na ifdeclaração, porque não é; JavaScript suporta apenas escopo de função
Andreas Grech
111

O data()método do jQuery é útil e pouco conhecido. Permite vincular dados a elementos DOM sem modificar o DOM.

clawr
fonte
4
data () é realmente de grande ajuda.
Pim Jager
3
Notei que ele não funciona com elementos sem o ID definido.
pensador
20
@Thinker: Sim, ele faz.
Alex Barrett
Use data () em vez de declarar variáveis ​​js globais, imo.
Johan
95

Filtros de aninhamento

Você pode aninhar filtros (como o nickf mostrou aqui ).

.filter(":not(:has(.selected))")
Nathan Long
fonte
3
Embora tenha cuidado com isso ...: realiza uma pesquisa completa, para que possa ficar bastante caro.
harpo 18/05/10
80

Eu realmente não sou fã do $(document).ready(fn)atalho. Claro que reduz o código, mas também reduz a legibilidade do código. Quando você vê $(document).ready(...), você sabe o que está olhando. $(...)é usado de muitas outras maneiras para fazer sentido imediatamente.

Se você possui várias estruturas, pode usar jQuery.noConflict();o que diz, mas também pode atribuir uma variável diferente para ela assim:

var $j = jQuery.noConflict();

$j("#myDiv").hide();

Muito útil se você tiver várias estruturas que podem ser $x(...)resumidas em chamadas de estilo.

Oli
fonte
1
@ Oli: Sobre o documento ready-shorthand; Você tem um ponto. Mas nunca menos: é uma dica / truque. Um que eu uso em todo o meu código apenas porque acho que "parece" melhor. A questão de preferência pessoal, eu acho :)
cllpse
Todos os dias percorro XML / XLS / XLST inútil, sites escritos com muitas camadas de abstração, sistemas complexos de failover em sites que nunca superam os servidores mais humildes ... e ainda assim as pessoas reclamam da diferença entre $ ( <string>) & $ (<function>). Me faz querer chorar :)
joebloggs
Quando vejo $ (function () {...}) eu sei o que está acontecendo. As coisas mais comuns devem ser mais curtas. É por isso que transformamos frequentemente os fragmentos de código chamados em funções.
28610 luikore
77

Ooooh, não vamos esquecer os metadados do jQuery ! A função data () é ótima, mas precisa ser preenchida por meio de chamadas jQuery.

Em vez de quebrar a conformidade do W3C com atributos de elementos personalizados, como:

<input 
  name="email" 
  validation="required" 
  validate="email" 
  minLength="7" 
  maxLength="30"/> 

Use os metadados:

<input 
  name="email" 
  class="validation {validate: email, minLength: 2, maxLength: 50}" />

<script>
    jQuery('*[class=validation]').each(function () {
        var metadata = $(this).metadata();
        // etc.
    });
</script>
Filip Dupanović
fonte
7
atributos de dados html5 tornam isso menos um problema; há uma discussão em andamento em trazer html5 atributo de dados em linha com os dados do jQuery () função: forum.jquery.com/topic/...
Oskar Austegard
10
@Oskar - sim, isso foi implementado no jQuery 1.4.3 - os data-*atributos estão automaticamente disponíveis através de chamadas para.data()
nickf
73

Manipuladores de eventos ao vivo

Defina um manipulador de eventos para qualquer elemento que corresponda a um seletor, mesmo que ele seja adicionado ao DOM após o carregamento inicial da página:

$('button.someClass').live('click', someFunction);

Isso permite que você carregue conteúdo via ajax ou adicione-o via javascript e faça com que os manipuladores de eventos sejam configurados corretamente para esses elementos automaticamente.

Da mesma forma, para interromper a manipulação de eventos ao vivo:

$('button.someClass').die('click', someFunction);

Esses manipuladores de eventos ao vivo têm algumas limitações em comparação com os eventos regulares, mas funcionam muito bem na maioria dos casos.

Para mais informações, consulte a documentação do jQuery .

UPDATE: live()e die()foram descontinuados no jQuery 1.7. Consulte http://api.jquery.com/on/ e http://api.jquery.com/off/ para obter funcionalidade de substituição semelhante.

UPDATE2: live()foi obsoleto por muito tempo, mesmo antes do jQuery 1.7. Para versões jQuery 1.4.2+ anteriores a 1.7, use delegate()e undelegate(). O live()exemplo ( $('button.someClass').live('click', someFunction);) pode ser reescrita utilizando delegate()como que: $(document).delegate('button.someClass', 'click', someFunction);.

TM.
fonte
1
Sim, eu amo o novo material ao vivo. Observe que ele funciona apenas a partir do jQuery 1.3.
Nosredna
4
+ 1..você me salvou de muita dor no coração .. Acabei de ler a sua entrada e enquanto eu estava dando um tempo - tentando entender por que meu evento não estava disparando. Graças
Luke101
2
para outros usuários que chegarem atrasados ​​neste artigo, consulte também delegate (): api.jquery.com/delegate Semelhante ao viver, mas mais eficiente.
Oskar Austegard 14/10/10
2
Lembre-se de .vive bolhas até o corpo para que o evento ao vivo vinculado possa ser disparado. Se algo ao longo do caminho cancelar esse evento, o evento ao vivo não será acionado.
Nickytonline
1
live () e die () são métodos descontinuados desde o jQuery 1.7, lançado em 3 de novembro. Substituído por diante (), api.jquery.com/on e off (), api.jquery.com/off
Johan
46

Substitua funções anônimas por funções nomeadas. Isso realmente substitui o contexto do jQuery, mas parece mais com o uso do jQuery, devido à sua dependência das funções de retorno de chamada. Os problemas que tenho com funções anônimas inline são que eles são mais difíceis de depurar (muito mais fácil olhar para uma pilha de chamadas com funções com nomes distintos, em vez de 6 níveis de "anônimo"), e também o fato de várias funções anônimas dentro da mesma A cadeia jQuery pode se tornar difícil de ler e / ou manter. Além disso, funções anônimas normalmente não são reutilizadas; por outro lado, declarar funções nomeadas me incentiva a escrever código com maior probabilidade de ser reutilizado.

Uma ilustração; ao invés de:

$('div').toggle(
    function(){
        // do something
    },
    function(){
        // do something else
    }
);

Eu prefiro:

function onState(){
    // do something
}

function offState(){
    // do something else
}

$('div').toggle( offState, onState );
ken
fonte
Infelizmente, como o jQuery passa o destino do evento como this, você não pode obter OO "adequado" sem usar gabinetes. Eu costumo ir para um compromisso:$('div').click( function(e) { return self.onClick(e) } );
Ben Blank
3
Sinto muito, Ben, mas não vejo como o seu comentário tem relevância para o meu post. Você pode elaborar? Você ainda pode usar 'self' (ou qualquer outra variável) usando minha sugestão; não vai mudar nada disso.
ken
Ben, o que exatamente você quer dizer !?
James
2
Devo mencionar: sempre fur variável e funções no espaço para nome não na raiz!
jmav
45

Definindo propriedades na criação do elemento

No jQuery 1.4, você pode usar um literal de objeto para definir propriedades ao criar um elemento:

var e = $("<a />", { href: "#", class: "a-class another-class", title: "..." });

... Você pode até adicionar estilos:

$("<a />", {
    ...
    css: {
        color: "#FF0000",
        display: "block"
    }
});

Aqui está um link para a documentação .

roosteronacid
fonte
43

em vez de usar um alias diferente para o objeto jQuery (ao usar noConflict), eu sempre escrevo meu código jQuery envolvendo tudo em um fechamento. Isso pode ser feito na função document.ready:

var $ = someOtherFunction(); // from a different library

jQuery(function($) {
    if ($ instanceOf jQuery) {
        alert("$ is the jQuery object!");
    }
});

Como alternativa, você pode fazer assim:

(function($) {
    $('...').etc()    // whatever jQuery code you want
})(jQuery);

Acho que é o mais portátil. Eu tenho trabalhado em um site que usa o Prototype AND jQuery simultaneamente e essas técnicas evitaram todos os conflitos.

nickf
fonte
O segundo exemplo é nice'r para os olhos :)
cllpse
25
Porém, existe uma diferença: o primeiro exemplo aguardará o acionamento do evento document.ready (), enquanto o segundo não.
23410 SamBeran
1
@ SamBeran: Verdade, o segundo exemplo será executado imediatamente; no entanto, se você estiver agrupando um literal de objeto, poderá usar $ (document) .ready (...) dentro do literal de objeto, o que significa que é possível especificar quando você deseja executar cada parte do código.
Wil Moore III
4
instanceOfnão vai funcionar, apenas instanceof. E não funcionará de qualquer maneira, porque jQuery instanceof jQueryretornará false. $ == jQueryé a maneira correta de fazer isso.
nyuszika7h
@ Nyuszika7H: Sim, você está certo, mas esse não é realmente o objetivo do exemplo de código.
nickf 15/02
39

Verifique o índice

O jQuery possui .index, mas é muito difícil de usar, pois você precisa da lista de elementos e transmite o elemento do qual deseja o índice:

var index = e.g $('#ul>li').index( liDomObject );

O seguinte é muito mais fácil:

Se você deseja conhecer o índice de um elemento em um conjunto (por exemplo, itens de lista) em uma lista não ordenada:

$("ul > li").click(function () {
    var index = $(this).prevAll().length;
});
redsquare
fonte
O que há de errado com o método core index ()? Está no núcleo desde a versão 1.2, pelo menos. docs.jquery.com/Core/index
ken
Ok, sim, eu estava interpretando um pouco o advogado do diabo, porque, ao revisar o índice do jQuery (), percebi que era uma espécie de dor no traseiro. Obrigado pelo esclarecimento!
ken
4
Isso é legal, mas importante saber que não funciona muito bem se você tivesse irmãos anteriores que não faziam parte da seleção.
TM.
2
Tenho certeza que, desde o jQuery 1.4, você pode simplesmente usar index()e obter o índice de seu pai.
alex
@alex - claro, mas observe a data deste post - foram 5 meses antes do lançamento do 1.4!
Redsquare
23

Atalho para o evento pronto

A maneira explícita e detalhada:

$(document).ready(function ()
{
    // ...
});

A abreviação:

$(function ()
{
    // ...
});
cllpse
fonte
22

Na função principal do jQuery, especifique o parâmetro context além do parâmetro seletor. A especificação do parâmetro context permite que o jQuery inicie a partir de uma ramificação mais profunda no DOM, em vez da raiz do DOM. Dado um DOM grande o suficiente, a especificação do parâmetro context deve ser traduzida em ganhos de desempenho.

Exemplo: localiza todas as entradas do tipo radio dentro do primeiro formulário no documento.

$("input:radio", document.forms[0]);

Referência: http://docs.jquery.com/Core/jQuery#expressioncontext

lupefiasco
fonte
10
Uma observação: $(document.forms[0]).find('input:radio')faz a mesma coisa. Se você olhar a fonte do jQuery, verá: se passar um segundo parâmetro para $, ele realmente chamará .find().
nyuszika7h
Que tal ... $('form:first input:radio')?
daGrevis 8/11
Paul Irish apontou em paulirish.com/2009/perf (a partir do slide 17) que fazer isso é "inverso" do ponto de vista da legibilidade. Como o @ Nyuszika7H apontou, ele usa .find () internamente e $ (document.forms [0]). Find ('input: radio') é muito fácil de ler, comparado a colocar o contexto no seletor inicial.
usar o seguinte comando
21

Não é realmente apenas o jQuery, mas fiz uma pequena ponte para o jQuery e o MS AJAX:

Sys.UI.Control.prototype.j = function Sys$UI$Control$j(){
  return $('#' + this.get_id());
}

É muito bom se você estiver executando bastante ASP.NET AJAX, já que o jQuery é suportado pelo MS agora com uma boa ponte significa que é muito fácil executar operações do jQuery:

$get('#myControl').j().hide();

Portanto, o exemplo acima não é ótimo, mas se você estiver escrevendo controles do servidor ASP.NET AJAX, será fácil ter o jQuery dentro da implementação do controle do lado do cliente.

Aaron Powell
fonte
A biblioteca clientside ajax fornecer uma maneira de encontrar um controle por parte do Id original que você atribuído (no trás código)
Chris S
this.get_id () retornará o ID do controle no escopo do cliente. O ID especificado pelo servidor é irrelivant como o ID do cliente é gerada dependendo da hierarquia cotrol pai
Aaron Powell
20

Otimize o desempenho de seletores complexos

Consultar um subconjunto do DOM ao usar seletores complexos melhora drasticamente o desempenho:

var subset = $("");

$("input[value^='']", subset);
cllpse
fonte
7
Somente se esse subconjunto for armazenado em cache / salvo.
Dykam 07/02
6
Isso não é muito diferente de $ (""). Find ("input [value ^ = '']")
Chad Moran
1
@ Tykam: qual é, no caso do meu código de exemplo. Mas seu argumento ainda é válido.
Cllpse
4
@Chad, é realmente idêntica e mapeia para a função que você escreveu
Mike Robinson
19

Falando de dicas e truques e também de alguns tutoriais. Eu achei essas séries de tutoriais (a série de vídeos “jQuery para iniciantes absolutos”) da Jeffery Way são MUITO ÚTEIS.

Ele tem como alvo os desenvolvedores que são novos no jQuery. Ele mostra como criar muitas coisas legais com o jQuery, como animação, Criando e removendo elementos e muito mais ...

Eu aprendi muito com isso. Ele mostra como é fácil usar o jQuery. Agora eu adoro e posso ler e entender qualquer script jQuery, mesmo que seja complexo.

Aqui está um exemplo que eu gosto de " Redimensionar texto "

1- jQuery ...

<script language="javascript" type="text/javascript">
    $(function() {
        $('a').click(function() {
            var originalSize = $('p').css('font-size'); // get the font size 
            var number = parseFloat(originalSize, 10); // that method will chop off any integer from the specified variable "originalSize"
            var unitOfMeasure = originalSize.slice(-2);// store the unit of measure, Pixle or Inch

            $('p').css('font-size', number / 1.2 + unitOfMeasure);
            if(this.id == 'larger'){$('p').css('font-size', number * 1.2 + unitOfMeasure);}// figure out which element is triggered
         });        
     });
</script>

2- Estilo CSS ...

<style type="text/css" >
body{ margin-left:300px;text-align:center; width:700px; background-color:#666666;}
.box {width:500px; text-align:justify; padding:5px; font-family:verdana; font-size:11px; color:#0033FF; background-color:#FFFFCC;}
</style>

2- HTML ...

<div class="box">
    <a href="#" id="larger">Larger</a> | 
    <a href="#" id="Smaller">Smaller</a>
    <p>
    In todays video tutorial, Ill show you how to resize text every time an associated anchor tag is clicked. Well be examining the slice”, parseFloat”, and CSS Javascript/jQuery methods. 
    </p>
</div>

Recomendo esses tutoriais ...

http://blog.themeforest.net/screencasts/jquery-for-absolute-beginners-video-series/

egyamado
fonte
19

Cada função assíncrona

Se você tiver documentos realmente complexos nos quais a execução da função jquery each () trava o navegador durante a iteração e / ou o Internet Explorer exibe a mensagem ' você deseja continuar executando este script ', esta solução salvará o dia.

jQuery.forEach = function (in_array, in_pause_ms, in_callback)
{
    if (!in_array.length) return; // make sure array was sent

    var i = 0; // starting index

    bgEach(); // call the function

    function bgEach()
    {
        if (in_callback.call(in_array[i], i, in_array[i]) !== false)
        {
            i++; // move to next item

            if (i < in_array.length) setTimeout(bgEach, in_pause_ms);
        }
    }

    return in_array; // returns array
};


jQuery.fn.forEach = function (in_callback, in_optional_pause_ms)
{
    if (!in_optional_pause_ms) in_optional_pause_ms = 10; // default

    return jQuery.forEach(this, in_optional_pause_ms, in_callback); // run it
};


A primeira maneira que você pode usá-lo é como cada ():

$('your_selector').forEach( function() {} );

Um segundo parâmetro opcional permite especificar a velocidade / atraso entre as iterações, o que pode ser útil para animações ( o exemplo a seguir aguardará 1 segundo entre as iterações ):

$('your_selector').forEach( function() {}, 1000 );

Lembre-se de que, como isso funciona de forma assíncrona, não é possível confiar nas iterações antes da próxima linha de código, por exemplo:

$('your_selector').forEach( function() {}, 500 );
// next lines of code will run before above code is complete


Escrevi isso para um projeto interno e, embora tenha certeza de que pode ser aprimorado, funcionou para o que precisávamos, por isso espero que alguns de vocês o considerem útil. Obrigado -

OneNerd
fonte
18

Sintaxe abreviada-sugar-thing - Armazene em cache uma coleção de objetos e execute comandos em uma linha:

Ao invés de:

var jQueryCollection = $("");

jQueryCollection.command().command();

Eu faço:

var jQueryCollection = $("").command().command();

Um caso de uso um tanto "real" pode ser algo nesse sentido:

var cache = $("#container div.usehovereffect").mouseover(function ()
{
    cache.removeClass("hover").filter(this).addClass("hover");
});
roosteronacid
fonte
4
-lo melhor para colocar o $ (this) de referência em uma variável local, porque você wil ter um menor perfomance bater aqui, porque vai demorar um pouco mais ...
Sander Versluys
4
Neste caso (sem trocadilhos), estou usando apenas "this" uma vez. Não há necessidade de armazenamento em cache.
cllpse
1
Uma pequena dica. Embora possa não importar nesse caso, é sempre uma má idéia fazer alterações extras no DOM. Digamos, por exemplo, o elemento sobre o qual você está passando o mouse já tinha a classe "pairar". Você removeria essa classe e a adicionaria novamente. Você pode contornar isso com $(this).siblings().removeClass("hover"). Sei que isso soa muito pequeno, mas toda vez que você altera o DOM, outro redesenho do navegador pode ser acionado. Outras possibilidades incluem eventos anexados ao DOMAttrModified ou as classes alterando a altura do elemento que pode disparar outros ouvintes de eventos "redimensionados".
gradbot
1
Se você deseja usar o cache e minimizar as alterações no DOM, pode fazer isso. cache.not(this).removeClass("hover")
gradbot
@gradbot: Eu não entendo seus dois últimos comentários. Você poderia expandir?
Randomblue 02/09
15

Eu gosto de declarar uma $thisvariável no início de funções anônimas, então eu sei que posso fazer referência a um jQueried isso.

Igual a:

$('a').each(function() {
    var $this = $(this);

    // Other code
});
Ben Crouse
fonte
12
Eu uso "que" em vez :)
cllpse
2
ROA: Sim, isso vai ser o ácido :) Você também pode usar arguments.callee para ativar uma função anônima para fazer referência a si mesmo
joebloggs
5
Joe - apenas um aviso, o callee vai desaparecer com o ECMAScript 5 e o modo estrito. Veja: ejohn.org/blog/ecmascript-5-strict-mode-json-and-more
Mike Robinson
@ Joe Você pode dar um nome, apenas desconfie das peculiaridades do IE .
alex
Ótimo exemplo também do uso de um $ no início do nome da variável para indicar uma variável de objeto jQuery em comparação com uma variável padrão. Adicionando isso ao início de qualquer variável que está armazenando em cache um objeto jQuery, você imediatamente sabe que é possível executar funções jQuery na variável. Torna o código muito mais legível imediatamente.
usar o seguinte comando
14

Salvar objetos jQuery em variáveis ​​para reutilização

Salvar um objeto jQuery em uma variável permite reutilizá-lo sem ter que procurar no DOM para encontrá-lo.

(Como @Louis sugeriu, agora uso $ para indicar que uma variável contém um objeto jQuery.)

// Bad: searching the DOM multiple times for the same elements
$('div.foo').each...
$('div.foo').each...

// Better: saving that search for re-use
var $foos = $('div.foo');
$foos.each...
$foos.each...

Como um exemplo mais complexo, digamos que você tenha uma lista de alimentos em uma loja e queira mostrar apenas os que correspondem aos critérios de um usuário. Você tem um formulário com caixas de seleção, cada uma contendo um critério. As caixas de seleção têm nomes como organice lowfat, e os produtos têm classes correspondentes - .organic, etc.

var $allFoods, $matchingFoods;
$allFoods = $('div.food');

Agora você pode continuar trabalhando com esse objeto jQuery. Toda vez que uma caixa de seleção é clicada (para marcar ou desmarcar), comece na lista principal de alimentos e filtre para baixo com base nas caixas marcadas:

// Whenever a checkbox in the form is clicked (to check or uncheck)...
$someForm.find('input:checkbox').click(function(){

  // Start out assuming all foods should be showing
  // (in case a checkbox was just unchecked)
  var $matchingFoods = $allFoods;

  // Go through all the checked boxes and keep only the foods with
  // a matching class 
  this.closest('form').find("input:checked").each(function() {  
     $matchingFoods = $matchingFoods.filter("." + $(this).attr("name")); 
  });

  // Hide any foods that don't match the criteria
  $allFoods.not($matchingFoods).hide();
});
Nathan Long
fonte
8
Minha convenção de nomenclatura é ter um $na frente. por exemplovar $allItems = ...
Louis
6
@Lavinski - Eu acho que a idéia é que isso $indica que este é um objeto jQuery, o que tornaria mais fácil diferenciar visualmente de outras variáveis.
Nathan Long
@ Louis - desde então, adotei sua convenção e atualizarei minha resposta de acordo. :)
Nathan Long
11

Parece que a maioria das dicas interessantes e importantes já foram mencionadas, portanto esta é apenas uma pequena adição.

A pequena dica é a função jQuery.each (objeto, retorno de chamada) . Todo mundo provavelmente está usando a função jQuery.each (retorno de chamada) para iterar sobre o próprio objeto jQuery porque é natural. A função do utilitário jQuery.each (objeto, retorno de chamada) itera sobre objetos e matrizes. Por um longo tempo, de alguma forma, não vi o que poderia ser, além de uma sintaxe diferente (não me importo de escrever todos os loops criados), e estou um pouco envergonhado por ter percebido sua principal força apenas recentemente.

O fato é que, como o corpo do loop no jQuery.each (objeto, retorno de chamada) é uma função , você obtém um novo escopo a cada vez no loop, o que é especialmente conveniente quando você cria fechamentos no loop.

Em outras palavras, um erro comum típico é fazer algo como:

var functions = [];
var someArray = [1, 2, 3];
for (var i = 0; i < someArray.length; i++) {
    functions.push(function() { alert(someArray[i]) });
}

Agora, quando você invocar as funções na functionsmatriz, receberá um alerta três vezes com o conteúdo undefinedque provavelmente não é o que você queria. O problema é que existe apenas uma variável ie todos os três fechamentos se referem a ela. Quando o loop termina, o valor final de ié 3 e someArrary[3]é undefined. Você poderia contornar isso chamando outra função que criaria o fechamento para você. Ou você usa o utilitário jQuery, que basicamente o faz por você:

var functions = [];
var someArray = [1, 2, 3];
$.each(someArray, function(item) {
    functions.push(function() { alert(item) });
});

Agora, quando você invoca as funções, recebe três alertas com o conteúdo 1, 2 e 3 conforme o esperado.

Em geral, não é nada que você não possa fazer sozinho, mas é bom ter.

Jan Zich
fonte
11

Acesse funções jQuery como faria com uma matriz

Adicionar / remover uma classe com base em um valor booleano ...

function changeState(b)
{
    $("selector")[b ? "addClass" : "removeClass"]("name of the class");
}

É a versão mais curta do ...

function changeState(b)
{
    if (b)
    {
        $("selector").addClass("name of the class");
    }
    else
    {
        $("selector").removeClass("name of the class");
    }
}

Não há muitos casos de uso para isso. Mesmo assim; Eu acho legal :)


Atualizar

Caso você não seja do tipo que lê comentários, o ThiefMaster ressalta que o toggleClass aceita um valor booleano , que determina se uma classe deve ser adicionada ou removida. No que diz respeito ao meu código de exemplo acima, essa seria a melhor abordagem ...

$('selector').toggleClass('name_of_the_class', true/false);
roosteronacid
fonte
2
Isso é legal e tem alguns usos interessantes, mas não é nada específico do jQuery ... isso é algo que você pode fazer em qualquer objeto JavaScript.
TM.
1
Obrigado :) ... É JavaScript básico; sim. Mas eu argumentaria que o jQuery é JavaScript. Não estou afirmando que isso seja específico do jQuery.
Cllpse
7
Nesse caso específico, você realmente deseja usar $('selector').toggleClass('name_of_the_class', b);.
ThiefMaster 02/11/2010
9

Atualizar:

Basta incluir este script no site e você obterá um console Firebug que aparece para depuração em qualquer navegador. Não é tão completo, mas ainda é bastante útil! Lembre-se de removê-lo quando terminar.

<script type='text/javascript' src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>

Confira este link:

Dos truques CSS

Atualização: Encontrei algo novo; é o JQuery Hotbox.

JQuery Hotbox

O Google hospeda várias bibliotecas JavaScript no Google Code. Carregá-lo de lá economiza largura de banda e carrega rapidamente porque já foi armazenado em cache.

<script src="http://www.google.com/jsapi"></script>  
<script type="text/javascript">  

    // Load jQuery  
    google.load("jquery", "1.2.6");  

    google.setOnLoadCallback(function() {  
        // Your code goes here.  
    });  

</script>

Ou

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>

Você também pode usar isso para saber quando uma imagem está totalmente carregada.

$('#myImage').attr('src', 'image.jpg').load(function() {  
    alert('Image Loaded');  
});

O "console.info" do firebug, que você pode usar para despejar mensagens e variáveis ​​na tela sem precisar usar caixas de alerta. "console.time" permite que você configure facilmente um cronômetro para agrupar um monte de código e ver quanto tempo leva.

console.time('create list');

for (i = 0; i < 1000; i++) {
    var myList = $('.myList');
    myList.append('This is list item ' + i);
}

console.timeEnd('create list');
Color Blend
fonte
pessoas no Irã não podem ver páginas da web carregadas com a API do Google. na verdade, o Google restringiu os iranianos a acessar o código do Google. so -1
Alireza Eliaderani 28/11/2009
Acabei de descobrir que você pode usar o firebug em qualquer navegador. Fantástico.
Tebo
9

Use métodos de filtragem sobre pseudo-seletores quando possível, para que o jQuery possa usar querySelectorAll (que é muito mais rápido que chiar). Considere este seletor:

$('.class:first')

A mesma seleção pode ser feita usando:

$('.class').eq(0)

O que é mais rápido porque a seleção inicial de '.class' é compatível com QSA

Ralph Holzmann
fonte
@ Nyuszika7H Acho que você está perdendo o objetivo. O ponto é que o QSA não pode otimizar a maioria dos pseudo-seletores, portanto, $ ('. Class: eq (0)') seria mais lento que $ ('. Class'). Eq (0).
Ralph Holzmann 11/11
9

Remover elementos de uma coleção e preservar a cadeia

Considere o seguinte:

<ul>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
    <li>Four</li>
    <li>Five</li>
</ul>


$("li").filter(function()
{
    var text = $(this).text();

    // return true: keep current element in the collection
    if (text === "One" || text === "Two") return true;

    // return false: remove current element from the collection
    return false;
}).each(function ()
{
    // this will alert: "One" and "Two"       
    alert($(this).text());
});

A filter()função remove elementos do objeto jQuery. Nesse caso: Todos os elementos li que não contenham o texto "Um" ou "Dois" serão removidos.

roosteronacid
fonte
Não é mais simples usar "each" e mover a alteração de margem dentro do switch?
DisgruntledGoat
Atualizei minha resposta. Por favor, deixe-me saber se estou sendo claro (er)
cllpse
Isso realmente REMOVE elementos li? Parece alertar com uma lista filtrada de elementos.
Cheeso
1
A função de filtro remove elementos da coleção dentro do objeto jQuery. Não afeta o DOM.
Cllpse
6
Na sua função de filtro, você pode simplesmente escrever: return !! $ (this) .text (). Match (/ One | Two /); ;)
Vincent
8

Alterando o tipo de um elemento de entrada

Eu me deparei com esse problema quando estava tentando alterar o tipo de um elemento de entrada já anexado ao DOM. Você precisa clonar o elemento existente, inseri-lo antes do elemento antigo e excluir o elemento antigo. Caso contrário, não funcionará:

var oldButton = jQuery("#Submit");
var newButton = oldButton.clone();

newButton.attr("type", "button");
newButton.attr("id", "newSubmit");
newButton.insertBefore(oldButton);
oldButton.remove();
newButton.attr("id", "Submit");
Vivin Paliath
fonte
7

Uso criterioso de scripts jQuery de terceiros, como validação de campo de formulário ou análise de URL. Vale a pena ver o que há para saber, quando você encontrar um requisito JavaScript em seguida.

harriyott
fonte
7

Quebras de linha e encadeamento

Ao encadear várias chamadas em coleções ...

$("a").hide().addClass().fadeIn().hide();

Você pode aumentar a legibilidade com quebras de linha. Como isso:

$("a")
.hide()
.addClass()
.fadeIn()
.hide();
cllpse
fonte
4
Nesse caso, o primeiro é mais legível, mas sim, existem alguns casos em que as quebras de linha aumentam a legibilidade.
nyuszika7h
7

Use .stop (true, true) ao acionar uma animação para impedir que ela repita a animação. Isso é especialmente útil para animações de sobreposição.

$("#someElement").hover(function(){
    $("div.desc", this).stop(true,true).fadeIn();
},function(){
    $("div.desc", this).fadeOut();
});
Kenneth J
fonte
7

Usando funções anônimas de execução automática em uma chamada de método, como .append()para iterar através de algo. IE:

$("<ul>").append((function ()
{
    var data = ["0", "1", "2", "3", "4", "5", "6"],
        output = $("<div>"),
        x = -1,
        y = data.length;

    while (++x < y) output.append("<li>" + info[x] + "</li>");

    return output.children();
}()));

Eu uso isso para percorrer coisas que seriam grandes e desconfortáveis ​​para sair do meu encadeamento para construir.

Rixius
fonte
5

Suporte a atributos de dados HTML5, em esteróides!

A função de dados foi mencionada anteriormente. Com ele, você pode associar dados a elementos DOM.

Recentemente, a equipe do jQuery adicionou suporte para atributos de dados * * personalizados em HTML5 . E como se isso não bastasse; eles alimentaram a função de dados com esteróides, o que significa que você pode armazenar objetos complexos na forma de JSON, diretamente na sua marcação.

O HTML:

<p data-xyz = '{"str": "hi there", "int": 2, "obj": { "arr": [1, 2, 3] } }' />


O JavaScript:

var data = $("p").data("xyz");

data.str // "hi there"
typeof data.str // "string"

data.int + 2 // 4
typeof data.int // "number"

data.obj.arr.join(" + ") + " = 6" // "1 + 2 + 3 = 6"
typeof data.obj.arr // "object" ... Gobbles! Errrghh!
roosteronacid
fonte