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

JavaScript Discussion :

Appliquer un style spécifique à la page en cours dans un menu include ?


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Appliquer un style spécifique à la page en cours dans un menu include ?
    Salut à toutes et tous,

    Je suis un complet débutant en javascript et php.
    J'utilise un include sur toutes mes pages pour afficher mon menu — chose très classique.
    Mon souci est : selon mes pages, l'item de la page en cours dans mon menu doit avoir un background-poisition différent.
    Je détaille…
    Dans toutes mes pages, j'écris ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php include("../../../menu_principal.php");  ?>
    Mon menu est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <ul id="menu" >
        <li><a class="accueil" href="accueil.php">&nbsp;</a></li>
        <li><a class="auteur" href="pages/auteur.php">&nbsp;</a>
        	<ul class="sousMenu">
            <li><a href="pages/auteur/livres.php">Livres</a></li>
                <li><a href="pages/auteur/articles.php">Articles</a></li>
                <li><a href="pages/auteur/sciences.php">Sciences</a></li>
            </ul>
        </li>
        <li><a class="bio" href="pages/bio.php">&nbsp;</a></li>
        <li><a class="contact" href="pages/contact.php">&nbsp;</a></li>
      </ul>
    Par exemple, quand on se trouve sur la page d'Accueil, je voudrais que le <li><a class="auteur"> affiche un background-position ordinaire (center top). Mais quand on est sur cette page Auteur, je voudrais que le background-position devienne : center -37px.
    Je voudrais le faire en javascript.

    Ça doit être simple, mais ça fait des heures que je traîne là-dessus — Quelqu'un peut-il m'aider, s'il vous plaît ?

    Par avance, merci…

  2. #2
    Membre chevronné

    Homme Profil pro
    Ingénieur Hospitalier
    Inscrit en
    Juillet 2004
    Messages
    993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 993
    Points : 1 768
    Points
    1 768
    Billets dans le blog
    1
    Par défaut
    Dans toute les pages tu appel la function qui se trouve dans ton menu include et tu leur fournit les bons paramètres.

    dans le menu include
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function affiche_moi_le_bon_sytle(param){
     document.getElementById("zone_ou_appliquer_la_class_css").className = param;
    }
    Dans toutes les pages appeler par ton menu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    window.onload = function(){
    affiche_moi_le_bon_style("class_auteur");
    };
    Pas tester mais voilà un principe parmi d'autres...
    Bonne soirée

    Pour te former correctement : Cours JavaScript

  3. #3
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    tu fais ça e php
    tu crée un autre fichier css pour les style spécifique
    et sur la page enquestion tu ajoute un link

    A+JYT

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par headmax Voir le message
    Dans toute les pages tu appel la function qui se trouve dans ton menu include et tu leur fournit les bons paramètres.

    dans le menu include
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function affiche_moi_le_bon_sytle(param){
     document.getElementById("zone_ou_appliquer_la_class_css").className = param;
    }
    Dans toutes les pages appeler par ton menu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    window.onload = function(){
    affiche_moi_le_bon_style("class_auteur");
    };
    Pas tester mais voilà un principe parmi d'autres...
    Bonne soirée
    Merci pour ton aide… J'ai essayé, mais cela ne fonctionne pas :-(
    Voici ce que j'ai fait :
    Dans mon menu qui est include, à la fin juste avant la balise </body> j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <script type="text/javascript">
     
    function affiche_moi_le_bon_sytle(param){
     document.getElementById("menu_gauche").className = param;
    }
    </script>
    Et dans ma page principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <script type="text/javascript">
     
    window.onload = function(){
    affiche_moi_le_bon_style("menuselected");
    };
    </script>
    Peux-tu me dire ce qui ne va pas, s'il te plaît ?

  5. #5
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    Citation Envoyé par supunna Voir le message
    Salut à toutes et tous,

    Je suis un complet débutant en javascript et php.
    J'utilise un include sur toutes mes pages pour afficher mon menu — chose très classique.
    Mon souci est : selon mes pages, l'item de la page en cours dans mon menu doit avoir un background-poisition différent.
    Je détaille…
    Dans toutes mes pages, j'écris ça :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php include("../../../menu_principal.php");  ?>

    Mon menu est :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <ul id="menu" >
        <li><a class="accueil" href="accueil.php">&nbsp;</a></li>
        <li><a class="auteur" href="pages/auteur.php">&nbsp;</a>
        	<ul class="sousMenu">
            <li><a href="pages/auteur/livres.php">Livres</a></li>
                <li><a href="pages/auteur/articles.php">Articles</a></li>
                <li><a href="pages/auteur/sciences.php">Sciences</a></li>
            </ul>
        </li>
        <li><a class="bio" href="pages/bio.php">&nbsp;</a></li>
        <li><a class="contact" href="pages/contact.php">&nbsp;</a></li>
      </ul>

    Par exemple, quand on se trouve sur la page d'Accueil, je voudrais que le <li><a class="auteur"> affiche un background-position ordinaire (center top). Mais quand on est sur cette page Auteur, je voudrais que le background-position devienne : center -37px.
    Je voudrais le faire en javascript.

    Ça doit être simple, mais ça fait des heures que je traîne là-dessus — Quelqu'un peut-il m'aider, s'il vous plaît ?

    Par avance, merci…
    je ne comprends pas pourquoi tu cherche à traité un truc que tu génère après l'avoir généré. il est pourtant bien plus simple de le traiter àt la génération

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?php $menuActif="accueil";
    include("../../../menu_principal.php");  ?>

    Mon menu est :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <ul id="menu" >
        <li><a class="accueil<?php echo ($menuActif=='accueil')?', menuselected':''?>" href="accueil.php">&nbsp;</a></li>
        <li><a class="auteur<?php echo ($menuActif=='auteur')?', menuselected':''?>" href="pages/auteur.php">&nbsp;</a>
        	<ul class="sousMenu<?php echo ($menuActif=='sousMenu')?', menuselected':''?>">
            <li><a href="pages/auteur/livres.php">Livres</a></li>
                <li><a href="pages/auteur/articles.php">Articles</a></li>
                <li><a href="pages/auteur/sciences.php">Sciences</a></li>
            </ul>
        </li>
        <li><a class="bio<?php echo ($menuActif=='bio')?', menuselected':''?>" href="pages/bio.php">&nbsp;</a></li>
        <li><a class="contact<?php echo ($menuActif=='contact')?', menuselected':''>" href="pages/contact.php">&nbsp;</a></li>
      </ul>


    du coup tu n'as plus à te casser la tête pour après coup indiquer quel est le menu actif
    il a déjà le css menuselected

    A+JYT

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup… Ça marche mais ça ne marche pas…
    Je m'explique : je suis obligé de définir le background dans ma class menuselected, sinon le background ne s'affiche pas.
    En fait, le menuselected vient effacer la précédente déclaration de style où figurait ce background.

    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    .menuselected {
    	background:url(../images/menu_pages/politique.png) no-repeat center -37px;
    	height: 37px;
    }

    Ça, cela marche bien.… Mais mes items du menu ont tous des backgrounds différents. Là, ils vont tous afficher le même background :-(
    Voici les styles CSS des items du menu :

    Code css : 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
    #bandeau_haut li a.accueil {
    	background:url(../images/menu_pages/accueil.png) no-repeat top center;
    	height: 37px;
    }
    #bandeau_haut li a.accueil:hover {
    	background:url(../images/menu_pages/accueil.png) no-repeat center -37px;
    }
    #bandeau_haut li a.politique {
    	background:url(../images/menu_pages/politique.png) no-repeat top center;
    	height: 37px;
    }
    #bandeau_haut li a.politique:hover {
    	background:url(../images/menu_pages/politique.png) no-repeat center -37px;
    }
    #bandeau_haut li a.militant {
    	background:url(../images/menu_pages/militant.png) no-repeat top center;
    	height: 37px;
    }
    #bandeau_haut li a.militant:hover {
    	background:url(../images/menu_pages/militant.png) no-repeat center -37px;
    }
    #bandeau_haut li a.auteur {
    	background:url(../images/menu_pages/auteur.png) no-repeat top center;
    	height: 37px;
    }
    #bandeau_haut li a.auteur:hover {
    	background:url(../images/menu_pages/auteur.png) no-repeat center -37px;
    }
    #bandeau_haut li a.bio {
    	background:url(../images/menu_pages/bio.png) no-repeat top center;
    	height: 37px;
    }
    #bandeau_haut li a.bio:hover {
    	background:url(../images/menu_pages/bio.png) no-repeat center -37px;
    }
    #bandeau_haut li a.contact {
    	background:url(../images/menu_pages/contact.png) no-repeat top center;
    	height: 37px;
    }
    #bandeau_haut li a.contact:hover {
    	background:url(../images/menu_pages/contact.png) no-repeat center -37px;
    }

  7. #7
    Membre chevronné

    Homme Profil pro
    Ingénieur Hospitalier
    Inscrit en
    Juillet 2004
    Messages
    993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 993
    Points : 1 768
    Points
    1 768
    Billets dans le blog
    1
    Par défaut
    Salut à tous,
    Comme a dit sekajin il serait préférable de le gérer en php.

    Code : 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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    <?php
    $page_css = $_GET['page_css'];
    ?>
    <style>
    <?php
    switch($page_css){
            case  "accueil" :
    ?>
    #bandeau_haut li a.accueil {
    	background:url(../images/menu_pages/accueil.png) no-repeat top center;
    	height: 37px;
    }
    #bandeau_haut li a.accueil:hover {
    	background:url(../images/menu_pages/accueil.png) no-repeat center -37px;
    }	
    <?php 
                    break;
            case "politique" :
    ?>
     
    #bandeau_haut li a.politique {
    	background:url(../images/menu_pages/politique.png) no-repeat top center;
    	height: 37px;
    }
    #bandeau_haut li a.politique:hover {
    	background:url(../images/menu_pages/politique.png) no-repeat center -37px;
    }
    <?php 
                    break;
            case "militant" : 
    ?>
    #bandeau_haut li a.militant {
    	background:url(../images/menu_pages/militant.png) no-repeat top center;
    	height: 37px;
    }
    #bandeau_haut li a.militant:hover {
    	background:url(../images/menu_pages/militant.png) no-repeat center -37px;
    }
    <?php 
                    break;
            case "auteur" :
    ?>
    #bandeau_haut li a.auteur {
    	background:url(../images/menu_pages/auteur.png) no-repeat top center;
    	height: 37px;
    }
    #bandeau_haut li a.auteur:hover {
    	background:url(../images/menu_pages/auteur.png) no-repeat center -37px;
    }
    <?php 
                    break;
            case "bio" :
    ?>
    #bandeau_haut li a.bio {
    	background:url(../images/menu_pages/bio.png) no-repeat top center;
    	height: 37px;
    }
    #bandeau_haut li a.bio:hover {
    	background:url(../images/menu_pages/bio.png) no-repeat center -37px;
    }
    <?php 
                    break;
            case "contact" :
    ?>
    #bandeau_haut li a.contact {
    	background:url(../images/menu_pages/contact.png) no-repeat top center;
    	height: 37px;
    }
    #bandeau_haut li a.contact:hover {
    	background:url(../images/menu_pages/contact.png) no-repeat center -37px;
    }
    <?php 
                    break;
           default:
    }
    ?>
    #bandeau_haut li a.accueil {
    	background:url(../images/menu_pages/accueil.png) no-repeat top center;
    	height: 37px;
    }
    #bandeau_haut li a.accueil:hover {
    	background:url(../images/menu_pages/accueil.png) no-repeat center -37px;
    }
    </style>
    <body>
    <a href="pages/auteur/livres.php?page_css=auteur">test</a>
    </body>
    C'est un peu trash comme méthode, mais ça le don de marcher, comme as dit sekajin, php est appelé avant même que ta page se charge donc, c plus pratique et plus adapté, car il est pas nécessaire de faire ça en js.
    NB: j'ai passer un paramètre sur le click de ton menu en mettant le bon paramètre en GET tu le récupéra dans ton switch dès la lecture du style page ton code...

    Bonne chance A+

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Un peu trash, c'est vrai… Ce qui m'embête en fait, c'est que je dois mettre du php dans mes liens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="pages/auteur/livres.php?page_css=auteur">test</a>
    Or, plus tard, ce site doit être géré par quelqu'un qui s'y connait encore moins que moi, qui ne connait rien de rien. Il éditera ses pages avec un éditeur html wysiwyg. Mettre du php sera au-dessus de ses forces
    Ce qui était séduisant dans la tentative de sekajin, c'est qu'on ne touchait pas au lien, juste au class.
    C'est pour cela que je cherche une solution à base de javascript, qui automatisera l'opération, sans devoir ajouter quoi que ce soit au lien.
    Ça doit être possible de faire ça en javascript.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    J'ai trouvé ce script qui fonctionne, mais pas tout à fait…
    Code : 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
    function highlightMenu(){
    var cettePage = document.location.href;
    //pour eviter les liens internes
    if(cettePage.indexOf('#') != -1)
       cettePage = cettePage.substring(0,cettePage.indexOf('#'));
     
    for(var i=0;i < document.links.length;i++){
     
        var lien = document.links[i].getAttribute('href');
    	//IE retourne l'url total du lien tandis que NS retourne que l'attribut href
    	//on contourne le probléme en comparant les derniers caractères
        if( cettePage.substring(cettePage.length-lien.length,cettePage.length) == lien ){
             document.links[i].className = 'menuselected';
        //cas de la homepage appelée depuis la racine /
        }else if( (document.location.pathname == '/') && ( (lien.substring(0,6) == 'index.') || ( (cettePage + 'index.') == lien.substring(0,cettePage.length + 6) ))){
             document.links[i].className = 'menuselected';	
        }
    }
    }
     
    highlightMenu();
    La class menuselected {color:orange} est bien chargée, mais avant ma class .menus li a qui définit la couleur ordinaire de mes liens. Elle est donc annulée. Je ne comprends pas pourquoi. Dans ma feuille de style, je la place en dernier, et j'ai essayé toutes les places sur ma page php pour le script : dans le head, en fin de page, rien n'y fait…

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    En fait, même en CSS tout simplement, le souci est le même :
    EN suivant les cours CSS , dans le head, après le lien vers ma feuille de styles, je place une balise <style> pour déclarer un nouveau style… Normalement, il devrait annuler le style précédent (déclaré dans me feuille CSS) mais c'est le contraire qui se passe.
    La feuille CSS chargée avant écrase le nouveau style.
    Code : 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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta http-equiv="content-language" content="fr" />
    <title>Test</title>
    <link rel="shortcut icon" href="../../../images/favicon.png" type="image/png" />
    <link rel="alternate" type="application/rss+xml" href="http://www.xxxxxx/rss.xml" title="Les dernières parutions" />
    <link href="../../../styles/styles_pages.css" rel="stylesheet" type="text/css" media="screen" />
    <style type="text/css">
    a.politique {
    	background-position: 0px -37px;
    }
    </style>
    </head>
    <body>

  11. #11
    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
    Ca n'a rien à voir, c'est juste une notion de "poids" d'une déclaration par rapport à une autre.
    En gros, plus tu indiques de sélecteurs dans une règle, plus elle aura de poids par rapport aux autres quel que soit l'ordre des déclarations (même si concrètement, c'est un peu plus complexe que ça puisque le type de sélecteur : identifiant, classe ou balise est primordial).

    Par exemple :
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    div .classe{
        background-color: blue;
    }
    .classe{
        background-color: green;
    }
    ici, le fond sera bleu bien que la déclaration soit faite avant car le sélecteur à un poids plus important.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Ah mais si, ça a tout à voir, parce que cela a même réglé mon problème !! C'était exactement ça qu'il fallait faire, tout simplement.
    Un grand merci pour les réponses et aussi pour les cours et tutoriels CSS : http://css.developpez.com/cours/

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

Discussions similaires

  1. Remplacer l'adresse de la page en cours dans l'historique
    Par BugFactory dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 04/11/2014, 21h42
  2. [CS4] Appliquer le style à toutes ses pages
    Par yapaf_oto dans le forum Dreamweaver
    Réponses: 2
    Dernier message: 15/02/2010, 20h54
  3. faire ressortir le liens de la page en cours dans un menu
    Par Invité dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 27/12/2008, 13h00
  4. Réponses: 1
    Dernier message: 17/11/2008, 17h30
  5. titre de la page en cours dans l'entête
    Par guillaume07 dans le forum Mise en forme
    Réponses: 7
    Dernier message: 07/08/2008, 13h43

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