H2 - P2019

Développement web

Cours 14 - 2016-01-11

JS

jQuery

Qu'est-ce que jQuery

jQuery est une librairie JS conçue par Jon Resig en 2006 dans le but de faciliter le développement javascript et plus particulierrement de faciliter la manipulation du DOM.

jQuery n'est pas nécessaire, mais très pratique.
On le retrouve sur la majorité des sites.

Alternatives :

You might not need jquery

Comment l'utiliser

Avant de choisir jQuery, il faut décider de la version à utiliser

  • 1.x compatible IE 6+
  • 2.x compatible IE 9+

Il existe deux façons d'ajouter jQuery à votre page

  • En local
  • Via CDN

En local

  • Allez sur la page de téléchargement
  • Téléchargez la version désirée
  • Rajoutez le code suivant à la fin de votre HTML avant la fermeture du <body>, avant votre script


                    

Via CDN

  • Rajoutez le code suivant à la fin de votre HTML avant la fermeture du <body>


                    

Avantages et désavantages du CDN

  • Si l'utilisateur l'a déjà téléchargé via un autre site, le fichier sera en cache
  • Distribution rapide
  • Dépendance
  • Nécessite connexion Internet

Sélecteur

  • L'intégralité de la librarie fonctionne autour de la variable $
  • Rien à voir avec PHP
  • $ est un alias de la variable jQuery
  • Vous savez que jQuery a bien été ajouté à la page si cette variable renvoie quelque-chose

console.log( $ );
                    
  • $ va vous permettre de sélectionner des éléments du DOM
    
    var foo = $( '.container li.bar' );
                                
  • Va renvoyer un "objet jQuery"
  • Un objet jQuery est un tableau d'objet JS natif avec une multitude de méthodes en bonus
  • Le sélecteur est très similaire à un sélecteur CSS. On peut la majorité des astuces classiques :
    .
    #
    >
    ,
    :first-child
    :last-child
    :odd
    :even
    ...

Si aucun élément n'a été trouvé, on récupère bien un objet jQuery, mais ce sera un tableau vide


var foo = $( '.container li a' ); // Sélecteur ne correspondant à rien
console.log( foo.length );        // 0
                    

Le processus de sélection prend du temps

Améliorer les performances de votre site en cachant les variables jQuery


// Bad
window.setInterval( function()
{
    var foo = $( '.container li' );
    console.log( foo );
}, 100 );
                    

// Good
var foo = $( '.container li' );
window.setInterval(function()
{
    console.log( foo );
}, 100 );
                    

Parcourir le DOM

Vous pouvez facilement parcourir le DOM à partir d'un élément jQuery en récupérant ses enfants, ses voisins, ses parents, etc.

children()


  • foo
  • bar
  • toto
  • tata
  • tutu

console.log( $( 'ul' ).children() );
                    

children()


  • foo
  • bar
  • toto
  • tata
  • tutu

console.log( $( 'ul' ).children( '.foo' ) );
                    

first()


  • foo
  • bar
  • toto
  • tata
  • tutu

console.log( $( 'ul li' ).first() );
                    

last()


  • foo
  • bar
  • toto
  • tata
  • tutu

console.log( $( 'ul li' ).last() );
                    

eq()


  • foo
  • bar
  • toto
  • tata
  • tutu

console.log( $( 'ul li' ).eq( 1 ) );
                    

find()


  • foo
  • bar
  • toto
  • tata
  • tutu

console.log( $( 'ul' ).find( 'span' ) );
                    

parent()



    
  • foo
  • bar
  • toto
  • tata
  • tutu

console.log( $( 'ul' ).parent() );
                    

parent()


  • foo
  • bar
  • toto
  • tata
  • tutu

console.log( $( 'ul' ).parent().parent() );
                    

parents()


  • foo
  • bar
  • toto
  • tata
  • tutu

console.log( $( 'ul' ).parents() );
                    

parents()


  • foo
  • bar
  • toto
  • tata
  • tutu

console.log( $( 'ul' ).parents( '.wrapper' ) );
                    

closest()


  • foo
  • bar
  • toto
  • tata
  • tutu

console.log( $( 'ul' ).closest( '.wrapper' ) );
                    

filter()


  • foo
  • bar
  • toto
  • tata
  • tutu

console.log( $( 'ul li' ).filter( '.foo' ) );
                    

not()


  • foo
  • bar
  • toto
  • tata
  • tutu

console.log( $( 'ul li' ).not( '.foo' ) );
                    

Créer le DOM

Vous pouvez facilement créer un élément


var new_element_1 = $( '<div></div>' );

var new_element_2 = $( '<div />' );

var new_element_3 = $( '<div>' );
                    

Pour l'ajouter au DOM, nous avons le choix parmi plusieurs méthodes

  • append : Ajoute à l'intérieur, à la fin
  • prepend : Ajoute à l'intérieur, au début
  • before : Ajoute juste avant
  • after : Ajoute juste après

container

var new_element = $( '<div>' );
$( '.container' ).append( new_element );
                    

Supprimer le DOM

Vous pouvez supprimer des éléments avec

  • remove : Supprime l'élément sélectionné
  • empty : Vide l'élément sélectionné

$( '.container' ).empty();
$( '.container' ).remove();
                    

Modifier le DOM

Vous pouvez modifier le style d'un élément, changer ses classes et changer son contenu directement

text et html permettent de récupérer et modifier l'intérieur de l'élément

  • text('...') va préserver les caractères
  • html('...') va tenter de convertir les caractères en HTML

var container = $( '.container' );

console.log( container.html() );
console.log( container.text() );

container.text( 'my little span' );
container.html( 'my little span' );
                    

Classes

  • addClass : Rajoute une ou plusieurs classes
  • removeClass : Supprime une ou plusieurs classes
  • toggleClass : Supprime la classe si elle existe et la rajoute si elle n'existe pas
  • hasClass : Renvoie true si l'élément possède la classe

Classes


var container = $( '.container' );
container.addClass( 'toto' );
container.addClass( 'tata tutu' );
container.removeClass( 'container tata' );
container.toggleClass( 'container' );

console.log( container.hasClass( 'container' ) );
                    

Css

  • css permet de modifier le style
  • Celui-ci s'applique directement dans l'attribut style de l'élément
  • Les prefixes sont automatiquement ajoutés
  • Les propriétés s'expriment en camelCase
  • Rajoute automatiquement px si non spécifié
  • Permet aussi de récupérer la valeur

Css


console.log( $( '.container' ).css( 'marginLeft' ) );

$('.container').css( {
    backgroundColor : 'red',
    marginLeft      : 20,
    transform       : 'translateY(20px)'
} );

console.log( $( '.container' ).css( 'marginLeft' ) );
                    

Dans la mesure du possible, il vaut mieux changer les classes d'un éléments plutôt que d'utiliser la méthode css()

Animer le DOM

Fades

  • fadeIn : Fait apparaitre l'élément
  • fadeOut : Fait disparaitre l'élément
  • fadeToggle : Fait apparaitre ou disparaître l'élément
  • fadeTo : Fade jusqu'à un certain point

Fade


var container = $( '.container' );

container.fadeIn();           // Default fade in
container.fadeOut( 2000 );    // Slow fade out
container.fadeTo( 400, 0.5 ); // Fade to 0.5
                    

Fade

Le dernier argument des méthodes de fade correspond au callback

Il s'agit de la fonction à éxecuter une fois le fade terminé

Fade


var container = $( '.container' );

container.fadeOut( 1000, function()
{
    container.fadeIn( 1000 );
} );
                    

Fade

Une fois caché, l'élément est en display:none;

Slides

  • slideDown : Fait apparaitre l'élément
  • slideUp : Fait disparaitre l'élément
  • slideToggle : Fait apparaitre ou disparaître l'élément

Slides

  • Le dernier argument est aussi le callback
  • Une fois caché, l'élément est en display:none;

Slides


var container = $( '.container' );

container.slideToggle( 1000, function()
{
    container.slideToggle( 1000 );
});
                    

Animate

La méthode animate permet d'animer la majorité des propriétés de style quantifiables

Pour animer une couleur, il faut rajouter jQuery UI

Animate


var container = $( '.container' );

container.animate( {
    width : 600
}, 2000 );
                    

Stop

Toutes ces méthodes d'animation se basent sur une queue

Si vous en appelez plusieurs à la suite sans qu'elles aient eu le temps de se terminer, elles se joueront à la suite.

Il est possible de stopper une queue avec la méthode stop

Stop


var container = $( '.container' );

container.slideDown( 2000, function()
{
    container.slideUp( 2000, function()
    {
        container.slideDown( 2000, function()
        {
            container.slideUp( 2000 );
        } );
    } );
} );

window.setTimeout( function()
{
    container.stop();
}, 2800 );
                    

Stop

Pour arrêter toute la queue, il faut rajouter true en paramètre du stop

Stop


var container = $( '.container' );

container.slideDown( 2000, function()
{
    container.slideUp( 2000, function()
    {
        container.slideDown( 2000, function()
        {
            container.slideUp( 2000 );
        } );
    } );
} );

window.setTimeout( function()
{
    container.stop( true );
}, 2800 );
                    

Événements

Les objets jQuery déclenchent des événements qu'il est possible d'écouter

On va pouvoir savoir quand l'utilisateur click sur un élément, écrit dans un input ou redimensionne son viewport

ON

  • on permet d'écouter un événement
  • Le premier argument est le nom de l'événement
  • Le deuxième argument est le callback (il s'agit de la fonction à éxecuter quand l'événement survient)

$( '.container' ).on( 'click', function()
{
    console.log( 'click' );
} );
                    

ON

La fonction autorise un argument. Celui-ci donne de nombreuses informations sur l'événement


$( '.container' ).on( 'click', function( e )
{
    console.log( e );
} );
                    

ON

Il est possible d'écouter plusieurs événements pour un même callback


$( '.container' ).on( 'click mouseenter mouseleave', function( e )
{
    console.log( e.type );
} );
                    

ON

Il est possible d'empêcher l'événement original de se produire (exemple : click sur un lien sensé emmener sur une autre page) avec return false ou e.preventDefault()


$( 'a' ).on( 'click', function( e )
{
    e.preventDefault();
} );
                    

$( 'a' ).on( 'click', function()
{
    return false;
} );
                    

ON

Il est possible de récupérer l'élément qui a déclenché l'action avec this

Il s'agit d'un élément JS natif, on peut le retransformer en élément jQuery avec $( this )


$( 'a' ).on( 'click', function( e )
{
    console.log( $( this ) );
} );
                    

OFF

off permet d'arrêter d'écouter un ou plusieurs événements


var container = $( '.container' );
container.on( 'mouseenter mouseleave', function( e )
{
    console.log( e.type );
} );
container.off( 'mouseenter' );
                    

TRIGGER

trigger permet de déclencher soi-même l'événement


var container = $( '.container' );
container.on( 'mouseenter mouseleave', function( e )
{
    console.log( e.type );
} );
container.trigger( 'mouseenter' );
container.trigger( 'mouseenter' );
container.trigger( 'mouseenter' );
                    

Événements généraux (liste non exhaustive)

  • click
  • dblclick
  • mousedown
  • mousemove
  • mouseover
  • mouseenter
  • mouseup
  • mouseleave

Événements inputs

  • focusin
  • focusout
  • keypress
  • keyup
  • keydown
  • blur
  • select
  • change
  • submit (sur formulaire)

Événements window

  • resize
  • scroll

Ajax

  • Ajax permet de faire des requêtes et de récupérer le contenu renvoyé
  • S'appelle avec $.ajax() en passant un objet en paramètre contenant toutes les options
  • Limité par les sécurités du navigateur et de la destination

$.ajax( {
    url     : 'http://monsite.com',
    success : function( res )
    {
        console.log( res );
    },
    error : function()
    {

    }
} );
                    

Quelques options

  • url : Url de la requêtes
  • success : callback si l'appel a fonctionné
  • error : callback si l'appel n'a pas fonctionné
  • method : méthode d'envoi (GET ou POST)
  • data : paramètres à envoyer
  • dataType : format de retour attendu (json, xml, html, ...)

Une requête ajax peut-être annulée en l'ayant d'abord sauvegardée puis en lui appliquant la méthode abort()


var ajax = $.ajax( {
    /* ... */
} );

ajax.abort();
                    
Try jQuery (pour revoir les bases)