Consejos y trucos de jQuery

507

Sintaxis

Almacenamiento de datos

Mejoramiento

Diverso

roosteronacid
fuente

Respuestas:

252

Crear un elemento HTML y mantener una referencia

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 */


Comprobando si existe un elemento

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


Escribiendo tus propios selectores

$.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
fuente
93
Escribir sus propios selectores es bastante hábil
Hugoware
22
Además, si sirve de ayuda, puede hacer $ ("<div />") y lograr lo mismo que $ ("<div> </div>")
Hugoware
44
Me encanta la nueva parte del selector, no sabía eso.
Pim Jager
55
Dado que no puedo editar wikis comunidad aún: combinar la asignación y comprobación de la existencia conif ((var someDiv = $("#someDiv")).length) { /* do stuff with someDiv... */ }
Ben en blanco
44
@Ben: La razón por la que evito tales expresiones idiomáticas en JavaScript es porque no quiero dar la ilusión de someDivhaber sido examinado en la ifdeclaración, porque no lo es; JavaScript solo admite el alcance de la función
Andreas Grech,
111

El data()método de jQuery es útil y poco conocido. Le permite enlazar datos a elementos DOM sin modificar el DOM.

clawr
fuente
44
data () es de gran ayuda.
Pim Jager
3
Me di cuenta de que no funciona con elementos sin ID de conjunto.
Pensador
20
@Thinker: Sí, lo hace.
Alex Barrett el
Use data () en lugar de declarar variables js globales, imo.
Johan
95

Filtros de anidamiento

Puede anidar filtros (como se muestra aquí ).

.filter(":not(:has(.selected))")
Nathan Long
fuente
3
Aunque tenga cuidado con esto ...: realiza una búsqueda exhaustiva, por lo que puede ser bastante costoso.
harpo
80

Realmente no soy fanático del $(document).ready(fn)atajo. Claro que reduce el código, pero también reduce la legibilidad del código. Cuando ves $(document).ready(...), sabes lo que estás mirando. $(...)se usa de muchas otras maneras para tener sentido de inmediato.

Si tiene varios marcos, puede usarlos jQuery.noConflict();como dice, pero también puede asignarle una variable diferente de esta manera:

var $j = jQuery.noConflict();

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

Muy útil si tiene varios marcos que se pueden reducir a $x(...)llamadas de estilo.

Oli
fuente
1
@Oli: Sobre el documento listo-taquigrafía; tiene un punto. Pero nunca menos: es un consejo / truco. Uno que uso en todo mi código simplemente porque creo que "se ve" mejor. Una cuestión de preferencia personal, supongo :)
cllpse
Todos los días paso por XML / XLS / XLST sin sentido, sitios escritos con demasiadas capas de abstracción, complejos sistemas de conmutación por error en sitios que nunca superarán a los servidores más humildes ... y aún la gente se queja de la diferencia entre $ ( <cadena>) y $ (<función>). Me
dan
Cuando veo $ (function () {...}) sé lo que está pasando. Las cosas más habituales deberían ser más cortas. Es por eso que convertimos frecuentemente fragmentos de código llamados en funciones.
luikore
77

¡Ooooh, no olvidemos los metadatos de jQuery ! La función data () es excelente, pero debe completarse mediante llamadas jQuery.

En lugar de romper el cumplimiento del W3C con atributos de elementos personalizados como:

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

Use metadatos en su lugar:

<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ć
fuente
77
Los atributos de datos html5 hacen que esto sea menos problemático; Hay un debate en curso sobre cómo poner el atributo de datos html5 en línea con la función data () de jquery: forum.jquery.com/topic/…
Oskar Austegard
10
@Oskar - sí, esto se ha implementado en jQuery 1.4.3 - los data-*atributos están disponibles automáticamente a través de llamadas a.data()
nickf
73

Manejadores de eventos en vivo

Establezca un controlador de eventos para cualquier elemento que coincida con un selector, incluso si se agrega al DOM después de la carga inicial de la página:

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

Esto le permite cargar contenido a través de ajax o agregarlo a través de javascript y hacer que los controladores de eventos se configuren correctamente para esos elementos automáticamente.

Del mismo modo, para detener el manejo de eventos en vivo:

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

Estos controladores de eventos en vivo tienen algunas limitaciones en comparación con los eventos regulares, pero funcionan muy bien en la mayoría de los casos.

Para obtener más información, consulte la documentación de jQuery .

ACTUALIZACIÓN: live()y die()están en desuso en jQuery 1.7. Consulte http://api.jquery.com/on/ y http://api.jquery.com/off/ para obtener una funcionalidad de reemplazo similar.

ACTUALIZACIÓN2: live()ha quedado en desuso por mucho tiempo, incluso antes de jQuery 1.7. Para las versiones jQuery 1.4.2+ anteriores a 1.7 use delegate()y undelegate(). El live()ejemplo ( $('button.someClass').live('click', someFunction);) se puede reescribir usando delegate()como que: $(document).delegate('button.someClass', 'click', someFunction);.

TM.
fuente
1
Sí, me encantan las nuevas cosas en vivo. Tenga en cuenta que solo funciona a partir de jQuery 1.3.
Nosredna
44
+ 1 ... me has ahorrado mucho dolor de corazón ... Acabo de leer tu entrada y mientras me tomaba un descanso, resolví el problema por qué mi evento no se disparaba. Gracias
Luke101
2
para cualquier otra persona que llegue tarde a este artículo, también puede consultar delegate (): api.jquery.com/delegate Similar a live, pero más eficiente.
Oskar Austegard
2
Solo recuerda .live burbujea hasta el cuerpo para que se pueda disparar el evento en vivo. Si algo en el camino cancela ese evento, el evento en vivo no se disparará.
nickytonline
1
live () y die () son métodos obsoletos desde que jQuery 1.7 se lanzó el 3 de noviembre. Reemplazado por on (), api.jquery.com/on y off (), api.jquery.com/off
Johan
46

Reemplazar funciones anónimas con funciones con nombre. Esto realmente reemplaza el contexto de jQuery, pero entra en juego más de lo que parece cuando se usa jQuery, debido a su dependencia de las funciones de devolución de llamada. Los problemas que tengo con las funciones anónimas en línea son que son más difíciles de depurar (mucho más fácil ver una pila de llamadas con funciones con nombres distintos, en lugar de 6 niveles de "anónimo"), y también el hecho de que múltiples funciones anónimas dentro de la misma jQuery-chain puede volverse difícil de leer y / o mantener. Además, las funciones anónimas generalmente no se reutilizan; Por otro lado, declarar funciones con nombre me anima a escribir código que es más probable que se reutilice.

Una ilustración; en vez de:

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

Yo prefiero:

function onState(){
    // do something
}

function offState(){
    // do something else
}

$('div').toggle( offState, onState );
conocer
fuente
Desafortunadamente, debido a que jQuery pasa el objetivo del evento como this, no puede obtener un OO "adecuado" sin usar recintos. Por lo general, voy por un compromiso:$('div').click( function(e) { return self.onClick(e) } );
Ben Blank
3
Lo siento, Ben, pero no veo cómo tu comentario tiene alguna relevancia para mi publicación. ¿Puedes elaborar? Todavía puede usar 'self' (o cualquier otra variable) usando mi sugerencia; no cambiará nada de eso en absoluto.
ken
Yeh, Ben, ¿qué quieres decir exactamente?
James
2
Debo mencionar: ¡siempre variables de piel y funciones en el espacio de nombres, no en la raíz!
jmav
45

Definir propiedades en la creación del elemento

En jQuery 1.4 puede usar un literal de objeto para definir propiedades cuando crea un elemento:

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

... Incluso puedes agregar estilos:

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

Aquí hay un enlace a la documentación .

roosteronacid
fuente
43

en lugar de usar un alias diferente para el objeto jQuery (cuando uso noConflict), siempre escribo mi código jQuery envolviéndolo todo en un cierre. Esto se puede hacer en la función document.ready:

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

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

Alternativamente, puede hacerlo así:

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

Creo que este es el más portátil. He estado trabajando en un sitio que usa Prototype AND jQuery simultáneamente y estas técnicas han evitado todos los conflictos.

nickf
fuente
El segundo ejemplo es agradable para los ojos :)
cllpse
25
Sin embargo, hay una diferencia, el primer ejemplo esperará a que se active el evento document.ready (), mientras que el segundo no.
SamBeran
1
@SamBeran: Cierto, el segundo ejemplo se ejecutará de inmediato; sin embargo, si está envolviendo un objeto literal, puede usar $ (document) .ready (...) dentro del objeto literal, lo que significa que puede especificar cuándo desea ejecutar cada pieza de código.
Wil Moore III
44
instanceOfno funcionará, solo instanceof. Y no funcionará de todos modos, porque jQuery instanceof jQueryvolverá false. $ == jQueryEs la forma correcta de hacerlo.
nyuszika7h
@ Nyuszika7H: Sí, tienes razón, pero ese no es realmente el punto del ejemplo de código.
nickf
39

Consulta el índice

jQuery tiene .index pero es difícil de usar, ya que necesita la lista de elementos y pasar el elemento del que desea el índice:

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

Lo siguiente es mucho más fácil:

Si desea conocer el índice de un elemento dentro de un conjunto (por ejemplo, elementos de la lista) dentro de una lista desordenada:

$("ul > li").click(function () {
    var index = $(this).prevAll().length;
});
redsquare
fuente
¿Qué hay de malo con el método core index ()? Ha estado en el núcleo desde 1.2 al menos. docs.jquery.com/Core/index
ken
Ok, sí, estaba jugando al abogado del diablo, porque mientras revisaba el índice de jQuery () me di cuenta de que era un dolor en el trasero. ¡Gracias por la aclaración!
ken
44
Esto es genial, pero es importante saber que no funciona del todo bien si tenía hermanos anteriores que no formaban parte de la selección.
TM.
2
Estoy bastante seguro de que desde jQuery 1.4, puede usar index()y obtener el índice de su padre.
alex
@alex, claro, pero tenga en cuenta la fecha de esta publicación: ¡pasaron 5 meses antes del lanzamiento 1.4!
Redsquare
23

Taquigrafía para el evento listo

La forma explícita y detallada:

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

La taquigrafía:

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

En la función central jQuery, especifique el parámetro de contexto además del parámetro selector. Especificar el parámetro de contexto permite que jQuery comience desde una rama más profunda en el DOM, en lugar de desde la raíz del DOM. Dado un DOM suficientemente grande, especificar el parámetro de contexto debería traducirse en ganancias de rendimiento.

Ejemplo: Encuentra todas las entradas de tipo radio dentro de la primera forma del documento.

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

Referencia: http://docs.jquery.com/Core/jQuery#expressioncontext

revs lupefiasco
fuente
10
Una nota: $(document.forms[0]).find('input:radio')hace lo mismo. Si observa la fuente jQuery, verá: si le pasa un segundo parámetro $, en realidad llamará .find().
nyuszika7h
¿Qué hay de ... $('form:first input:radio')?
daGrevis
Paul Irish señaló en paulirish.com/2009/perf (comenzando en la diapositiva 17) que hacerlo es "al revés" desde el punto de vista de la legibilidad. Como señaló @ Nyuszika7H, utiliza .find () internamente y $ (document.forms [0]). Find ('input: radio') es muy fácil de leer, en comparación con poner el contexto en el selector inicial.
LocalPCGuy
21

Realmente no solo jQuery, pero hice un pequeño puente agradable para jQuery y MS AJAX:

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

Es realmente agradable si está haciendo una gran cantidad de ASP.NET AJAX, ya que jQuery es compatible con MS ahora que tiene un buen puente significa que es realmente fácil hacer operaciones de jQuery:

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

Entonces, el ejemplo anterior no es excelente, pero si está escribiendo controles de servidor ASP.NET AJAX, hace que sea fácil tener jQuery dentro de su implementación de control del lado del cliente.

Aaron Powell
fuente
Tiene la biblioteca del lado del cliente Ajax proporciona una manera de encontrar un control por parte del ID original que ha asignado (en el código detrás)
Chris S
this.get_id () le devolverá la ID del control en el ámbito del cliente. La ID especificada por el servidor es irrelevante ya que la ID del cliente se genera dependiendo de la jerarquía de cotrol principal
Aaron Powell
20

Optimizar el rendimiento de selectores complejos

Consultar un subconjunto del DOM cuando se utilizan selectores complejos mejora drásticamente el rendimiento:

var subset = $("");

$("input[value^='']", subset);
cllpse
fuente
77
Solo si ese subconjunto está en caché / guardado.
Dykam
66
Eso no es muy diferente a $ (""). Find ("input [value ^ = '']")
Chad Moran
1
@Dykam: que es, en el caso de mi código de ejemplo. Pero tu punto sigue siendo válido.
cllpse
44
@Chad, en realidad es idéntico y se asigna a la función que escribiste
Mike Robinson
19

Hablando de consejos y trucos y también algunos tutoriales. Encontré que esta serie de tutoriales (serie de videos “jQuery for Absolute Beginners”) de Jeffery Way es MUY ÚTIL.

Está dirigido a aquellos desarrolladores que son nuevos en jQuery. Él muestra cómo crear muchas cosas interesantes con jQuery, como animación, Crear y eliminar elementos y más ...

Aprendí mucho de eso. Muestra cómo es fácil usar jQuery. Ahora me encanta y puedo leer y comprender cualquier script jQuery incluso si es complejo.

Aquí hay un ejemplo que me gusta " Cambiar el tamaño del 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>

Recomiendo estos tutoriales ...

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

egyamado
fuente
19

Asíncrono de cada función ()

Si tiene documentos realmente complejos donde ejecutar la función jquery each () bloquea el navegador durante la iteración, y / o Internet Explorer aparece el mensaje ' ¿desea continuar ejecutando este script '? Esta solución le ahorrará el día.

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


La primera forma en que puede usarlo es como cada ():

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

Un segundo parámetro opcional le permite especificar la velocidad / retraso entre iteraciones que puede ser útil para las animaciones ( el siguiente ejemplo esperará 1 segundo entre iteraciones ):

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

Recuerde que dado que esto funciona de forma asíncrona, no puede confiar en que las iteraciones se completen antes de la siguiente línea de código, por ejemplo:

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


Escribí esto para un proyecto interno, y aunque estoy seguro de que se puede mejorar, funcionó para lo que necesitábamos, así que espero que algunos de ustedes lo encuentren útil. Gracias -

OneNerd
fuente
18

Sintaxis shorthand-sugar-thing: almacena en caché una colección de objetos y ejecuta comandos en una línea:

En vez de:

var jQueryCollection = $("");

jQueryCollection.command().command();

Hago:

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

Un caso de uso algo "real" podría ser algo así:

var cache = $("#container div.usehovereffect").mouseover(function ()
{
    cache.removeClass("hover").filter(this).addClass("hover");
});
roosteronacid
fuente
44
Es mejor poner el $ (este) de referencia en una variable local, ya que Wil llevar a un menor perfomance de golpe aquí, porque va a tardar un poco más ...
Sander Versluys
44
En este caso (sin juego de palabras), solo estoy usando "esto" una vez. No hay necesidad de almacenamiento en caché.
cllpse
1
Un pequeño consejo. Si bien puede no importar en este caso, siempre es una mala idea realizar cambios adicionales en el DOM. Digamos, por ejemplo, que el elemento sobre el que está pasando el mouse ya tenía la clase "hover" Eliminaría esta clase y la volvería a agregar. Puedes evitar eso con $(this).siblings().removeClass("hover"). Sé que esto suena como algo pequeño, pero cada vez que cambias el DOM, se puede activar otra actualización del navegador. Otras posibilidades incluyen eventos adjuntos a DOMAttrModified o las clases que cambian la altura del elemento que podría disparar a otros oyentes de eventos de "cambio de tamaño".
gradbot
1
Si desea utilizar el caché y minimizar los cambios de DOM, puede hacerlo. cache.not(this).removeClass("hover")
gradbot
@gradbot: No entiendo tus dos últimos comentarios. ¿Podrías expandirte?
Randomblue
15

Me gusta declarar una $thisvariable al comienzo de las funciones anónimas, así que sé que puedo hacer referencia a un jQueried esto.

Al igual que:

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

    // Other code
});
Ben Crouse
fuente
12
Yo uso "eso" en su lugar :)
cllpse
2
ROA: Sí, ese será el ácido :) También puede usar argumentos.callee para permitir que una función anónima se haga referencia a sí misma
JoeBloggs
55
Joe: solo un aviso, la persona que llama se irá con ECMAScript 5 y el modo estricto. Ver: ejohn.org/blog/ecmascript-5-strict-mode-json-and-more
Mike Robinson
@ Joe Puedes darle un nombre, solo ten cuidado con las peculiaridades de IE .
alex
Gran ejemplo también de usar un $ al comienzo del nombre de la variable para indicar una variable de objeto jQuery en comparación con una variable estándar. Al agregar eso al comienzo de cualquier variable que esté almacenando en caché un objeto jQuery, inmediatamente sabrá al mirarlo que puede realizar funciones jQuery en la variable. Hace que el código sea mucho más legible de inmediato.
LocalPCGuy
14

Guardar objetos jQuery en variables para su reutilización

Guardar un objeto jQuery en una variable le permite reutilizarlo sin tener que buscar en el DOM para encontrarlo.

(Como sugirió @Louis, ahora uso $ para indicar que una variable contiene un 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 ejemplo más complejo, supongamos que tiene una lista de alimentos en una tienda y desea mostrar solo los que coinciden con los criterios de un usuario. Tiene un formulario con casillas de verificación, cada una con un criterio. Las casillas de verificación tienen nombres como organicy lowfat, y los productos tienen clases correspondientes .organic, etc.

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

Ahora puede seguir trabajando con ese objeto jQuery. Cada vez que se hace clic en una casilla de verificación (para marcar o desmarcar), comience desde la lista maestra de alimentos y filtre en función de las casillas 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
fuente
8
Mi convención de nomenclatura es tener un $frente. por ejemplovar $allItems = ...
Louis
66
@Lavinski: creo que la idea es que $indica que se trata de un objeto jQuery, lo que facilitaría la diferenciación visual de otras variables.
Nathan Long
@Louis: desde entonces adopté su convención y actualizaré mi respuesta en consecuencia. :)
Nathan Long
11

Parece que la mayoría de los consejos interesantes e importantes ya se han mencionado, por lo que este es solo una pequeña adición.

El pequeño consejo es la función jQuery.each (objeto, devolución de llamada) . Probablemente todos estén usando jQuery.each (devolución de llamada) para iterar sobre el objeto jQuery en sí porque es natural. La función de utilidad jQuery.each (objeto, devolución de llamada) itera sobre objetos y matrices. Durante mucho tiempo, de alguna manera no vi para qué podría ser, aparte de una sintaxis diferente (no me importa escribir todos los bucles de moda), y me da un poco de vergüenza que me di cuenta de su fuerza principal recientemente.

La cuestión es que, dado que el cuerpo del bucle en jQuery.each (objeto, devolución de llamada) es una función , siempre obtiene un nuevo alcance en el bucle que es especialmente conveniente cuando crea cierres en el bucle.

En otras palabras, un error común típico es hacer algo como:

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

Ahora, cuando invoque las funciones en la functionsmatriz, recibirá una alerta tres veces con el contenido undefinedque probablemente no sea lo que deseaba. El problema es que solo hay una variable i, y los tres cierres se refieren a ella. Cuando finaliza el ciclo, el valor final de ies 3 y someArrary[3]es undefined. Podría solucionarlo llamando a otra función que crearía el cierre para usted. O usa la utilidad jQuery, que básicamente lo hará por usted:

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

Ahora, cuando invocas las funciones, obtienes tres alertas con el contenido 1, 2 y 3 como se esperaba.

En general, no es nada que no puedas hacer tú mismo, pero es bueno tenerlo.

Jan Zich
fuente
11

Acceda a las funciones de jQuery como lo haría con una matriz

Agregar / eliminar una clase basada en un booleano ...

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

Es la versión más corta de ...

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

No hay muchos casos de uso para esto. Sin embargo; Creo que es genial :)


Actualizar

En caso de que no sea del tipo de lectura de comentarios, ThiefMaster señala que toggleClass acepta un valor booleano , que determina si una clase debe agregarse o eliminarse. Entonces, en lo que respecta a mi código de ejemplo anterior, este sería el mejor enfoque ...

$('selector').toggleClass('name_of_the_class', true/false);
roosteronacid
fuente
2
Esto es ordenado y tiene algunos usos interesantes, pero no es nada específico de jQuery en absoluto ... esto es algo que puede hacer en cualquier objeto JavaScript.
TM.
1
Gracias :) ... Es JavaScript básico; Si. Pero yo diría que jQuery es JavaScript. No estoy afirmando que esto sea específico de jQuery.
cllpse
77
Sin $('selector').toggleClass('name_of_the_class', b);embargo, en este caso específico realmente quieres usar .
ThiefMaster
9

Actualizar:

Simplemente incluya este script en el sitio y obtendrá una consola Firebug que aparece para depurar en cualquier navegador. No es tan completo, pero sigue siendo bastante útil. Recuerde eliminarlo cuando haya terminado.

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

Mira este enlace:

De trucos CSS

Actualización: encontré algo nuevo; es el JQuery Hotbox.

JQuery Hotbox

Google aloja varias bibliotecas de JavaScript en Google Code. Cargarlo desde allí ahorra ancho de banda y se carga rápidamente porque ya se ha almacenado en caché.

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

O

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

También puede usar esto para saber cuándo una imagen está completamente cargada.

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

El "console.info" de firebug, que puede usar para volcar mensajes y variables en la pantalla sin tener que usar cuadros de alerta. "console.time" te permite configurar fácilmente un temporizador para envolver un montón de código y ver cuánto tiempo lleva.

console.time('create list');

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

console.timeEnd('create list');
3 revoluciones
fuente
ppl en Irán no puede ver las páginas web cargadas con la API de Google. De hecho, Google ha restringido a los iraníes para acceder al código de Google. so -1
Alireza Eliaderani
Me acabo de enterar que puedes usar firebug en cualquier navegador. Eso es genial.
Tebo
9

Use métodos de filtrado sobre pseudo-selectores cuando sea posible para que jQuery pueda usar querySelectorAll (que es mucho más rápido que sizzle). Considere este selector:

$('.class:first')

La misma selección se puede hacer usando:

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

Lo cual es más rápido porque la selección inicial de '.class' es compatible con QSA

Ralph Holzmann
fuente
@ Nyuszika7H Creo que te estás perdiendo el punto. El punto es que QSA no puede optimizar la mayoría de los pseudo-selectores, por lo tanto $ ('. Class: eq (0)') sería más lento que $ ('. Class'). Eq (0).
Ralph Holzmann
9

Eliminar elementos de una colección y preservar la posibilidad de encadenamiento

Considera lo siguiente:

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

La filter()función elimina elementos del objeto jQuery. En este caso: se eliminarán todos los elementos li que no contengan el texto "Uno" o "Dos".

revs roosteronacid
fuente
¿No es más simple usar "cada uno" y mover el cambio de margen dentro del interruptor?
DisgruntledGoat
Actualicé mi respuesta. Por favor, avíseme si me estoy aclarando (er)
cllpse
¿Esto realmente ELIMINA elementos li? Parece alertar con una lista filtrada de elementos.
Cheeso
1
La función de filtro elimina elementos de la colección dentro del objeto jQuery. No afecta al DOM.
cllpse
66
En su función de filtro, simplemente puede escribir: return !! $ (this) .text (). Match (/ One | Two /); ;)
Vincent
8

Cambiar el tipo de un elemento de entrada

Me encontré con este problema cuando intentaba cambiar el tipo de un elemento de entrada ya conectado al DOM. Debe clonar el elemento existente, insertarlo antes del elemento anterior y luego eliminar el elemento anterior. De lo contrario no funciona:

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
fuente
7

Uso juicioso de scripts de jQuery de terceros, como la validación de campos de formulario o el análisis de URL. Vale la pena ver de qué se trata para saber cuándo será el próximo requisito de JavaScript.

harriyott
fuente
7

Saltos de línea y encadenabilidad

Al encadenar varias llamadas en colecciones ...

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

Puede aumentar la legibilidad con saltos de línea. Me gusta esto:

$("a")
.hide()
.addClass()
.fadeIn()
.hide();
cllpse
fuente
44
En este caso, el primero es más legible, pero sí, hay algunos casos en que los saltos de línea aumentan la lectura.
nyuszika7h
7

Use .stop (verdadero, verdadero) cuando se activa una animación evita que se repita la animación. Esto es especialmente útil para las animaciones de rollover.

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

Usar funciones anónimas de ejecución automática en una llamada a un método, como .append()iterar a través de algo. ES DECIR:

$("<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();
}()));

Utilizo esto para recorrer cosas que serían grandes e incómodas para romper mi encadenamiento para construir.

Rixius
fuente
5

Soporte de atributos de datos HTML5, ¡con esteroides!

La función de datos ha sido mencionada anteriormente. Con él, puede asociar datos con elementos DOM.

Recientemente, el equipo de jQuery ha agregado compatibilidad con los atributos de datos * personalizados de HTML5 . Y como si eso no fuera suficiente; Han alimentado a la fuerza la función de datos con esteroides, lo que significa que puede almacenar objetos complejos en forma de JSON, directamente en su marcado.

El HTML:

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


El 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!
revs roosteronacid
fuente