15 tips para desarrolladores de jQuery
jQuery
es actual referencia en construcción de paginas web cada vez más
prácticas. En este artículo te mostramos 15 técnicas de jQuery, las
cuales serán de gran ayuda para el uso de esta librería, comenzando con
unos tips de rendimiento y continuaremos con algunas de las
características menos vistas.
<!– Incluye la última versión. Esta librería depende de la anterior presentada –>
El
último ejemplo incluye la última versión 1.10.x de forma automática a
medida que esté disponible, esto está almacenado en caché sólo durante
una hora, así que es mejor no utilizarlo en entornos de producción.
for(var i=0;i<buttons.length;i++){
console.log(buttons[i]); // Un elemento DOM, no es un objeto jQuery.
}
// Incluso podemos cortarlo:
var firstFour = buttons.slice(0,4);
if(buttons.length){ // Verdad sólo si los botones contienen elementos
// Haz algo
}
if (i == 0) {
random = Math.floor(Math.random() * r.length);
}
return i == random;
};
})(jQuery);
// Así es como se usa:
$(’li:random’).addClass(’test_class’);
// Para usarlo:
$(’#elem’).animate({width:200},’slow’,'easeInOutQuad’);
$(’#panel button’).click($.proxy(function(){
// Esto apunta a #panel
$(this).fadeOut();
},this));
});
$.ajaxSetup({
url: ‘/ajax/’,
dataType: ‘json’
});
$.ajaxStart(function(){
showIndicator();
disableButtons();
});
$.ajaxComplete(function(){
hideIndicator();
enableButtons();
});
/*
// Métodos adicionales que puedes usar:
$.ajaxStop();
$.ajaxError();
$.ajaxSuccess();
$.ajaxSend();
*/
// Hazlo así:
$(’#elem’).animate({width:200}).delay(2000).animate({marginTop:100});
1) Usa la última versión de jQuery
Sonará
tonto, pero con toda la innovación en el proyecto de jQuery, una de las
maneras más fáciles de mejorar el rendimiento de tu sitio web es
utilizar simplemente la última versión de jQuery. Cada versión de la
biblioteca presenta optimizaciones y correcciones de errores, y la mayor
parte de la mejora en el tiempo implica solamente cambiar una etiqueta
de script.
Puedes
incluir directamente la librería de jQuery desde el servidor de Google,
el cual provee un hosting libre para una serie de librerías Javascript.
<!– Incluye una versión específica de jQuery, la versión 1.10.2 –>
<script src=”//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js“></script>
<!– Incluye la última versión. Esta librería depende de la anterior presentada –>
<script src=”//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js“></script>
2) Usa los selectores simples
Hasta
hace poco, la recuperación de los elementos DOM con jQuery fue una
combinación finamente coreografiada de analizar cadenas de selectores,
bucles de JavaScript y APIs incorporadas como getElementById(),
getElementsByTagName() y getElementsByClassName(). Pero ahora, todos los
principales navegadores soportan querySelectorAll(), que entiende los
selectores CSS de consulta y trae una ganancia significativa de
rendimiento.
Sin
embargo, debes tratar de optimizar la manera de recuperar los
elementos. Por no hablar de que muchos usuarios siguen utilizando
navegadores antiguos que obligan a jQuery a recorrer el árbol DOM, lo
cual lo hace más lento.
$(’li[data-selected="true"] a’) // Funciona, pero lento
$(’li.selected a’) // Bueno
$(’#elem’) // Mejor
$(’li.selected a’) // Bueno
$(’#elem’) // Mejor
La
selección por id es el más rápido. Si usted necesita seleccionar por
nombre de clase, colocas como prefijo la siguiente etiqueta -
$(’li.selected’). Estas optimizaciones afectan principalmente a los
navegadores antiguos y dispositivos móviles.
Accediendo
al DOM siempre será la parte más lenta de todas las aplicaciones de
JavaScript, por lo que minimizar código es beneficioso. Una de varias
maneras de hacer esto es almacenar en caché los resultados que jQuery
arroja. La variable que elija va a contener un objeto jQuery, que se
puede acceder más tarde en su script.
var buttons = $(’#a.button navegación’);
// Algunos prefieren prefijar sus variables con $:
var $buttons = $(’#navigation a.button’);
var $buttons = $(’#navigation a.button’);
Otra
cosa a destacar, es que jQuery ofrece un gran número de selectores
adicionales para mayor comodidad, como por ejemplo :visible, :hidden,
:animated y más, que no son selectores CSS3 válidos. El resultado es que
si las utilizas entonces la librería no puede utilizar
querySelectorAll(). Para remediar la situación, puedes primero
seleccionar los elementos que deseas trabajar, y más tarde filtrarlos,
así:
$(’a.button:animated’); // No usa querySelectorAll()
$(’a.button’).filter(’:animated’); // Si lo usa
$(’a.button’).filter(’:animated’); // Si lo usa
El resultado anterior es exactamente lo mismo, con la excepción de que el segundo es más rápido.
3) Objetos jQuery como Arrays
El
resultado de ejecutar un selector es un objeto jQuery. Sin embargo, la
biblioteca hace que parezca como si estás trabajando con una matriz
mediante la definición de los elementos de índice y una longitud.
// Seleccionando todos los botones de navegación:
var buttons = $(’#navigation a.button’);
// Podemos iterar a través de la colección:var buttons = $(’#navigation a.button’);
for(var i=0;i<buttons.length;i++){
console.log(buttons[i]); // Un elemento DOM, no es un objeto jQuery.
}
// Incluso podemos cortarlo:
var firstFour = buttons.slice(0,4);
Si
después te dedicas al rendimiento, mediante un procedimiento sencillo
con un for (o while) en lugar de $.each(), puedes hacer que el código
vaya varias veces más rápido.
Comprobando la longitud es también la única manera de determinar si tu colección contiene elementos.
if(buttons){ // Esto es siempre cierto
// Haz algo
}
// Haz algo
}
if(buttons.length){ // Verdad sólo si los botones contienen elementos
// Haz algo
}
4) La propiedad selector
jQuery provee una propiedad la cual contiene selectores que son usados para iniciar una cadena.
$(’#container li:first-child’).selector // #container li:first-child
$(’#container li’).filter(’:first-child’).selector // #container li.filter(:first-child)
$(’#container li’).filter(’:first-child’).selector // #container li.filter(:first-child)
Aunque
los ejemplos anteriores se dirigen a un mismo elemento, los selectores
son bastante diferentes. La segunda sentencia no es válido en realidad,
no la puedes utilizar como base de un nuevo objeto jQuery. Sólo
demuestra que el método de filtrado se utiliza para reducir la
colección.
5) Crear un objeto jQuery vacío
Crear
un nuevo objeto jQuery puede traer un significante gasto. Algunas
veces, podrías necesitar crear un objeto vacío, y llenarlo con el método
add().
var container = $([]);
container.add(another_element);
container.add(another_element);
Esta es también la base para el método quickEach() que se puede utilizar como una alternativa más rápida a los valores del each().
6) Seleccionar un elemento al azar
Como
he mencionado anteriormente, jQuery añade sus propios filtros de
selección. Al igual que con todo lo demás en la biblioteca, también
puedes crear el tuyo propio. Para ello sólo tienes que añadir una nueva
función a los objetos $.expr[':']. Un impresionante caso de uso fue
presentado por Waldek Mastykarz en su blog: la creación de un selector
para recuperar un elemento aleatorio. Puedes ver una versión ligeramente
modificada de su código abajo:
(function($){
var random = 0;
$.expr[':'].random = function(a, i, m, r) {var random = 0;
if (i == 0) {
random = Math.floor(Math.random() * r.length);
}
return i == random;
};
})(jQuery);
// Así es como se usa:
$(’li:random’).addClass(’test_class’);
7) Usar los Ganchos (Hooks) de CSS
El API de ganchos (Hooks) en CSS se
introdujo para dar a los desarrolladores la capacidad de obtener y
establecer valores CSS particulares. Al usarlo, puedes ocultar las
implementaciones específicas del navegador y exponer una interfaz
unificada para acceder a las propiedades particulares.
$.cssHooks['borderRadius'] = {
get: function(elem, computed, extra){
// Dependiendo del browser, lee el valor de
// -moz-border-radius, -webkit-border-radius o border-radius
},
set: function(elem, value){
// Establece la propiedad CSS3 apropiada
}
};
// Usa el código sin preocuparte de cuales propiedades realmente entiende navegador:get: function(elem, computed, extra){
// Dependiendo del browser, lee el valor de
// -moz-border-radius, -webkit-border-radius o border-radius
},
set: function(elem, value){
// Establece la propiedad CSS3 apropiada
}
};
$(’#rect’).css(’borderRadius’,5);
Lo que es aún mejor, es que la gente ya ha construido una amplia biblioteca de ganchos CSS que puede utilizar de forma gratuita en tu próximo proyecto.
8 - Usa la flexibilización de las funciones personalizadas
Probablemente has oído hablar de la flexibilización del plugin de jQuery por
ahora, que le permite añadir efectos a tus animaciones. El único
inconveniente es que esto presenta otro código JavaScript que los
visitantes tienen que cargar. Por suerte, sólo tienen que copiar el
efecto que necesitan del archivo plugin, y agregarlo al objeto
jQuery.easing:
$.easing.easeInOutQuad = function (x, t, b, c, d) {
if ((t/=d/2) < 1) return c/2*t*t + b;
return -c/2 * ((–t)*(t-2) - 1) + b;
};
if ((t/=d/2) < 1) return c/2*t*t + b;
return -c/2 * ((–t)*(t-2) - 1) + b;
};
// Para usarlo:
$(’#elem’).animate({width:200},’slow’,'easeInOutQuad’);
9) El $.proxy()
Una
de las desventajas de utilizar el retorno en funciones de jQuery
siempre ha sido que cuando se ejecutan por un método de la biblioteca,
el contexto se establece en un elemento diferente. Por ejemplo, si usted
tiene este marcado:
<div id=”panel” style=”display:none”>
<button>Cerrado</button>
</div>
<button>Cerrado</button>
</div>
Y tratas de ejecutar este código:
$(’#panel’).fadeIn(function(){
// Esto apunta a #panel
$(’#panel button’).click(function(){
// Esto apunta al botón
$(this).fadeOut();
});
});
// Esto apunta a #panel
$(’#panel button’).click(function(){
// Esto apunta al botón
$(this).fadeOut();
});
});
Tu te encontrarás con un problema, el botón desaparecerá, más no el panel. Con $.proxy, puedes escribirlo así:
$(’#panel’).fadeIn(function(){
// Usando $.proxy para enlazarlo:
// Usando $.proxy para enlazarlo:
$(’#panel button’).click($.proxy(function(){
// Esto apunta a #panel
$(this).fadeOut();
},this));
});
La
función de $.proxy toma dos argumentos, su función original, y un
contexto. Se devuelve una nueva función en la que el valor de este es
siempre fija al contexto. Puedes leer más acerca de $.Proxy en la documentación.
10) Determina el Peso de tu página
Un
hecho simple: cuanto más contenido tu página tiene, más el tiempo que
tarda el navegador para renderizar. Puedes obtener un conteo rápido del
número de elementos DOM en tu página ejecutando esto en la consola:
console.log ($(’*').length);
Cuanto
menor sea el número, más rápida será el renderizado de la página web.
Puedes optimizar mediante la eliminación de marcas redundantes y
elementos de envoltura innecesarios.
11) Convierte tu código en un plugin jQuery
Si
inviertes un poco de tiempo en escribir un fragmento de código jQuery,
considera convertirlo en un plugin. Esto promueve la reutilización de
código, limita las dependencias y ayuda a organizar la base del código
de su proyecto.
La creación de un plugin de jQuery no podría ser más fácil:
(function($){
$.fn.yourPluginName = function(){
// Tu código va aquí
return this;
};
})(jQuery);
$.fn.yourPluginName = function(){
// Tu código va aquí
return this;
};
})(jQuery);
12) Ajusta los valores por defecto de AJAX
Cuando
se activen las peticiones AJAX en tu aplicación, a menudo será
necesario que muestres algún tipo de indicación de que una solicitud
está en curso. Esto se puede hacer mediante la visualización de una
animación de carga, o mediante una superposición oscura. La gestión de
este indicador en la llamada $.get o $.post puede convertirse en algo
tedioso.
La mejor solución es establecer valores predeterminados y globales de AJAX utilizando uno de los métodos de jQuery.
/ / AjaxSetup es útil para configurar los valores predeterminados generales:
$.ajaxSetup({
url: ‘/ajax/’,
dataType: ‘json’
});
showIndicator();
disableButtons();
});
$.ajaxComplete(function(){
hideIndicator();
enableButtons();
});
/*
// Métodos adicionales que puedes usar:
$.ajaxStop();
$.ajaxError();
$.ajaxSuccess();
$.ajaxSend();
*/
13) Usa delay() para las animaciones
Encadenamiento
de efectos de animación es una herramienta poderosa en la caja de
herramientas de todos los desarrolladores de jQuery. Una de las
características más pasada por alto es que se puede introducir retrasos
entre las animaciones.
// Esto está mal:
$(’#elem’).animate({width:200},function(){
setTimeout(function(){
$(’#elem’).animate({marginTop:100});
},2000);
});
$(’#elem’).animate({width:200},function(){
setTimeout(function(){
$(’#elem’).animate({marginTop:100});
},2000);
});
// Hazlo así:
$(’#elem’).animate({width:200}).delay(2000).animate({marginTop:100});
Para
apreciar la cantidad de tiempo que salvamos de la animación de
jQuery(), imagínate si tuvieras que manejar todo tu mismo: lo necesario
para establecer tiempos de espera, analizar los valores de propiedad,
realizar un seguimiento del progreso de la animación, cancelación,
cuando proceda y actualizar numerosas variables en cada paso.
14) Usa los atributos de datos de HTML5
Los
atributos de datos HTML5 son un simple medio para integrar los datos en
una página web. Es útil para el intercambio de datos entre servidor y
el front end, algo que solía exigir la salida de bloques <script> o
marcas ocultas.
Con
los recientes cambios a los datos del método jQuery(), atributos de
datos de HTML5 son atraídos automáticamente y están disponibles como
entradas, como se puede ver en el siguiente ejemplo:
<div id=”d1″ data-role=”page” data-last-value=”43″ data-hidden=”true”
data-options=’{”name”:”Juan”}’>
</div>
data-options=’{”name”:”Juan”}’>
</div>
Para acceder a los atributos de datos de este div, utilizaría código como el siguiente:
$(”#d1″).data(”role”); // “pagina”
$(”#d1″).data(”lastValue”); // 43
$(”#d1″).data(”hidden”); // true;
$(”#d1″).data(”options”).name; // “Juan”;
$(”#d1″).data(”lastValue”); // 43
$(”#d1″).data(”hidden”); // true;
$(”#d1″).data(”options”).name; // “Juan”;
15) Almacenamiento local y jQuery
El
almacenaje local es un simple API para guardar la información en el
lado del cliente. Simplemente agregando tu data como una propiedad
global del objeto localStorage:
localStorage.theData = “Esto va a ser guardado entre las páginas refrescadas y los browsers reiniciados”;
Las
malas noticias es que no es soportado por viejos browsers. Esto es
donde tu puedes usar uno de los muchos plugins de jQuery que proveen
otras soluciones en caso de que localStorage no esté disponible, lo cual
hace que el almacenaje del lado del cliente funcione casi siempre.
// Revisa si la llave existe en el almacenaje
var value = $.jStorage.get(”key”);
if(!value){
// si no - carga la data desde el servidor
value = load_data_from_server();
// y salvalo
$.jStorage.set(”key”,value);
}
var value = $.jStorage.get(”key”);
if(!value){
// si no - carga la data desde el servidor
value = load_data_from_server();
// y salvalo
$.jStorage.set(”key”,value);
}
Si tienes alguna sugerencia que no has visto en la lista, utiliza la sección de comentarios para compartirla con nosotros.
Fuente y Traducción realizada por elWebmaster.com
Comentarios
Publicar un comentario