IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

Navigation en Ajax + Navigation Avec ancre [AJAX]


Sujet :

jQuery

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 62
    Points
    62
    Par défaut Navigation en Ajax + Navigation Avec ancre
    Bonjour,

    J'ai actuellement un site ou je voudrais que la moitié de la navigation ce fasse en AJAX et l'autre moitié en navigation par ancre (de haut en bas).
    Le problème est que je n'arrive pas à trouver de solution pour faire cela.

    Actuellement tout fonctionne en ajax mais le problème est que mes ancres (par exemple qui sommes nous, ...) ce trouve sur la page accueil.html et donc disparaît quand je charge une autre page (par exemple contact.html).
    Actuellement, même en splittant le href, cela va quand même faire une demande en ajax. Et si je clique sur par exemple qui_sommes_nous, cela vas produire une erreur me disant qu'il ne connait pas cette ancre (logique vu que accueil.html n'est plus chargée).

    Voila mon code : (donc dans mon footer par exemple tous les liens avec la class "nav" sont sencé ce charger AJAX et le reste sont des redirections vers des ancres)
    Index.php :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    <!DOCTYPE html> 
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
            <title>Nice Road</title>
            <link rel="stylesheet" href="css/style.css" type="text/css" />
            <script src="js/jquery-1.11.0.js" type="text/javascript"></script><!-- Insertion de la bibliotheque jQuery -->
            <script type="text/javascript" src="js/navigation.js"></script><!-- Gestion des pages en Ajax-->
            <script type="text/javascript" src="js/jquery.scrollTo.js"></script><!-- permet le scrollTo-->
            <!--[if lt IE 9]>
                <script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
            <![endif]-->
    	</head>
    <body>
    <!-- HEADER -->
        <header>
               <!-- MENU -->
                    <nav>
                        <ul>
                            <li><a href="#qui_sommes_nous" class="menu" var="1">NOS SERVICES</a></li>
                            <li><a href="#download" class="menu" var="2">TELECHARGER</a></li>
                            <li><a href="#" class="menu" var="3" >DEVENIR CHAUFFEUR</a></li>
                        </ul>
                    </nav>
                    <!-- END MENU -->
                    <div id="connexion">
                        <a href="connexion.html" >INSCRIPTION / CONNEXION</a>
                    </div>
        </header>
        <!-- END HEADER -->
    <section id="ajax">
            <?php 
                $d="vues/";
                $extension =".html";
                if(isset($_GET['p'])){
                    $p(strtolower($_GET['p']));
                    if(preg_match("/^[a-z0-9\-]+$/", $p) && file_exists($d.$p.$extension)){
                        include $d.$p.$extension;
                    }
                    else{
                        include $d."404.html";
                    }
                }
                else{
                    include $d."accueil.html";
                }
            ?>
        </section>
    <footer>
          <nav>
                    <ul>
                        <li><a href="#qui_sommes_nous">Nos services</a></li>
                        <li><a href="#contact">Contact</a></li>
                        <li><a href="#download">Téléchargez l'application Nice Road</a></li>
                        <li><a href="#" class="nav">Condition générales d'utilisation</a></li>
                        <li><a href="#" class="nav">Mentions légales</a></li>
                        <li><a href="#">Espace partenaires</a></li>
                    </ul>
                </nav>
    </footer>

    Ainsi que mon fichier navigation :

    Code jquery : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    $(document).ready(function(){
        $("#connexion a, footer nav ul li .nav").click(function(){
            page= $(this).attr("href");
            $.ajax({
                url: "vues/"+page,
                cache: false, 
                success: function(html){
                    showContent(html);
                },
                error:function(XMLHttpRequest, textStatus, errorThrown){
                    alert("textStatus");
                }
            })
            return false;
        });
    });
    /*Fonction qui affiche la page chargée*/
    function showContent(data){
        $("#ajax").fadeOut(500, function(){
            $("#ajax").empty();
            $("#ajax").append(data);
            $("#ajax").fadeIn(1000);
        });
    }

    J'espère m'être fais comprendre :-)
    Merci d'avance pour votre aide.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 175
    Points : 138
    Points
    138
    Par défaut
    Si tu n'as pas trop de liens a gérer, je crois que tu as plus vite fait d'inserer un.onclick dans le code HTML
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    onclick="navig('ancre','quisommesnous');"
    //ou bien 
    onclick="navig('page','conditionsgenerales');"
    et ensuite dans la fonction "navig",
    le 1er parametre te dit si c'est un appel de page ajax ou bien un saut vers une ancre.
    le 2eme paramètre te donne la destination

    tu utilise un tableau associatif pour stocker l'adresse de la page en plus.

    "ancre","adressepage"
    "ancre","adressepage"

    Ensuite tu n'as plus qu'a déterminer si tu te trouve déjà sur la bonne page ou non.
    Au besoin tu charge la bonne page en Ajax
    Au besoin tu saute jusqu'a l'ancre donné.


    En utilisant toujours le principe du tableau et ton code, tu peux aussi te passer de placer un onclick dans le code HTML si tu parvient a récupérer le nom de l'ancre (et qu'elle est unique dans tout le site)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monAncre = $this.attr("Href");

  3. #3
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    C'est plus un problème de conception celons moi.

    Quelle est la logique d'avoir un liens qui cible une ancre qui pourrait ne pas être disponible ?

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onclick="navig('ancre','quisommesnous');"
    Nous essayons au maximum d'orienter les réponses vers les bonnes pratiques et cette solution n'est certainement pas à recommander.

    Utiliser des attributs d'événement crée un lien beaucoup trop fort entre la structure HTML et le comportement JavaScript rendant le code difficile à maintenir ou à faire évoluer.
    La séparation des couches (HTML pour la structure, CSS pour la mise en forme et JavaScript pour le comportement) doit être une priorité dans le code.
    Il ne faudrait jamais avoir à entrer dans le code HTML pour modifier l'apparence ou la mise en forme.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 62
    Points
    62
    Par défaut
    Bonjour et merci à tous pour vos réponses et vos conseils,

    Sylvercis, ça m'a l'air bien comme idée et je pense en avoir tiré quelque chose :-)

    Bovino, est-ce qui si j'utilise la méthode de Sylvercis mais à la place de mettre un évenement onClick sur les liens je met un evenement en jQuery comme ceci :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <nav>
       <ul>
          <li><a href="mentions_legales.html" type="lien">Mentions Légales</a></li>
          <li><a href="#qui_sommes_nous" type="ancre" >Qui sommes nous ?</a></li>
       </ul>
    </nav>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $('nav a').click(){
    	type = $(this).attr(type);
    	if(type == "ancre"){
    		/* je vérifie dans mon tableau associatif dans quelle page est l'ancre et si la page est != current_page
                        et selon le résultat redirection en AJAX ou non vers la page puis scroll vers ancre */ 
    	}
    	else{
    		/* je vérifie si la page est != current_page et selon le resultat je redirige en ajax ou retourne false */
    	}
    });
    Cela conviens t'il ?

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Oui, c'est beaucoup mieux !

    Cependant, quelques maladresses encore dans ton code.
    Il est préférable d'utiliser .on('click', ...) plutôt que .click(...).
    Il n'est pas conseillé d'inventer des attributs exotiques qui rendront de plus le code invalide et peuvent induire en erreur.
    HTML5 offre la possibilité de créer des attributs personnalisés avec data-*
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <a data-type="ancre">
    est beaucoup plus correct et permet de surcroit d'utiliser l'API dataset, par exemple avec jQuery :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($(this).data('type') == 'ancre')

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 62
    Points
    62
    Par défaut
    Je vais tester avec data-* alors :-)

    Merci beaucoup pour vos précieux conseils :-) !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RichFaces+jsf+ajax] Navigation Tree avec rich:tree
    Par BigMac.com dans le forum JSF
    Réponses: 0
    Dernier message: 08/02/2011, 14h57
  2. [AJAX] lightbox avec une navigation en ajax
    Par negurah dans le forum AJAX
    Réponses: 1
    Dernier message: 25/08/2009, 13h21
  3. Réponses: 2
    Dernier message: 20/05/2005, 01h03
  4. navigation dans une jsp avec javascript
    Par petitelulu dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/11/2004, 18h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo