views:

1870

answers:

3

Hi, I'm new to JQuery, but wish to use it in a site that I'm building.

When the user mouses over an item in the menu with li class hovertriggerssubhead, I want to display some text below it, located in the div (nested inside the li) with id NavSubhead. I have looked at several examples of this, namely in the cookbook in the FAQ of the JQuery documentation and the code of the JQuery site itself.

This is my HTML code:

<div id="Navigation">
<ul>

<li class="current">
<a href="index.html">Home</a></li>

<li class="hovertriggerssubhead">
<a href="gallery.html">Gallery</a>

<div class="NavSubhead">
<p class="navsubheadtext">Under Construction</p>
</div> 
</li>

<li class="hovertriggerssubhead">

<div class="NavSubhead">
<p class="navsubheadtext">Under Construction</p>
</div> 
<a href="contact.html">Contact</a></li>

</ul>
</div>

I tried two methods of accomplishing this in my JQuery code; they are below:

$(document).ready(function() {

//first method
$(".NavSubhead").hide();

$('#Navigation li').hover(
      function(){$(this).find('div.NavSubhead:hidden').fadeIn(500);},
      function(){$(this).find('div.NavSubhead:visible').fadeOut(500);}
     );


//second method 
    $("#Navigation li div").hide(); 

    $("#Navigation li.hovertriggerssubhead").hover(
        function () {
     $(this).children("div.NavSubhead").show();
        },function(){
     $(this).children("div.NavSubhead").hide();
    });//hover

});// document ready

Any help would be appreciated. Thanks!

UPDATE: I've tried numerous answers, even one with a working demo, but it still doesn't work, which is very weird. Could it be related by any chance to constraints of the navigation html because of an encompassing table? The table has a fixed width. Other than that, I don't know what is the problem, and JQuery is referenced correctly. Thanks in advance!

UPDATE #2: As it's possible that this is not working because of some weird constraints in regards to my HTML, I'm going to post it here. As you can see below, I'm using this Slideshow framework too.

<html>
<head>
<title>MZ Photography</title>

<!-- Jquery Stuff -->

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"&gt;&lt;/script&gt;

<script type="text/javascript">

/*

$(function() {

  $("div.NavSubhead").hide();

 $('#Navigation li a').hover(
    function(){$(this).next().stop(false, true).slideDown().fadeIn(500);},
    function(){$(this).next().stop(false, true).slideUp().fadeOut(500);}
  );

});
*/



$(function() {

/* hacky nav highlighting */
var loc = window.location.href;
//strip the existing current state
$('#Navigation .current').removeClass('current');

//add class to current section...
//Home
if(loc.indexOf('MZPhotography.html') > -1){
       $('#Navigation #home').addClass('current');
}
//Gallery
else if(loc.indexOf('gallery') > -1){
       $('#Navigation #gallery').addClass('current');
}
//Contact
else if(loc.indexOf('contact.html') > -1){
       $('#Navigation #contact').addClass('current');
}



});

$(document).ready(function() {



  $("div.NavSubhead").hide();

  $('#Navigation li a').hover(
    function(){$(this).next().stop(false, true).slideDown().fadeIn(500);},
    function(){$(this).next().stop(false, true).slideUp().fadeOut(500);}
  ); 







});


</script>


<!-- End jquery stuff -->


<!-- Slideshow stuff begins here -->


<link rel="stylesheet" type="text/css" href="css/slideshow.css" media="screen" />
    <script type="text/javascript" src="js/mootools.js"></script>
    <script type="text/javascript" src="js/slideshow.js"></script>
    <script type="text/javascript">  
    //<![CDATA[
      window.addEvent('domready', function(){
        var data = {
          '30.jpg': { caption: '' }, 
          '25.jpg': { caption: '' }, 
          '21.jpg': { caption: '' }, 
          '16.jpg': { caption: '' },
       '11.jpg': { caption: '' },
       '13.jpg': { caption: '' },
       '12.jpg': { caption: '' },
       '9.jpg': { caption: '' },
       '4.jpg': { caption: '' },
       '2.jpg': { caption: '' },
       '3.jpg': { caption: '' },
       '6.jpg': { caption: '' },
       '7.jpg': { caption: '' },
       '14.jpg': { caption: '' },
       '8.jpg': { caption: '' },
       '10.jpg': { caption: '' },
       '15.jpg': { caption: '' },
       '17.jpg': { caption: '' },
       '22.jpg': { caption: '' },
       '28.jpg': { caption: '' },
       '26.jpg': { caption: '' },
       '27.jpg': { caption: '' },
       '24.jpg': { caption: '' },
       '23.jpg': { caption: '' },
       '19.jpg': { caption: '' },
       '18.jpg': { caption: '' },
       '20.jpg': { caption: '' },
       '29.jpg': { caption: '' },
       '31.jpg': { caption: '' },
       '32.jpg': { caption: '' },
       '1.jpg': { caption: '' },
       '5.jpg': { caption: '' },
       '33.jpg': { caption: '' },
       '34.jpg': { caption: '' },
       '35.jpg': { caption: '' },
       '36.jpg': { caption: '' }



        };
        var myShow = new Slideshow('show', data, {controller: true, height: 450, hu: 'images/', thumbnails: false, width: 600});
      });
    //]]>
    </script>


    <!-- end Slideshow -->

<link rel="stylesheet" href="site.css">

</head>
<body>

<table width="980"> <!--980 -->

<tr>

<td width="880">

<table width="880"> <!--880-->

<tr>

<td align="left">
<div id="logo">
<img src="images/title.png" />
</div>
</td>

<td align="right"><!--MENU-->
<div id="Navigation">
<ul>

<li id="home" class="current">
<a href="#top">Home</a></li>

<li id="gallery" class="hovertriggerssubhead">
<a href="gallery.html">Gallery</a>

<div class="NavSubhead">
<p class="navsubheadtext">Under Construction</p>
</div> 
</li>

<li id="contact" class="hovertriggerssubhead">
<a href="contact.html">Contact</a></li>

<div class="NavSubhead">
<p class="navsubheadtext">Under Construction</p>
</div> 

</ul>
</div>
</td>
</tr>
</table>

<table width="700">
<tr><td><br></td></tr>
<tr>
<!-- we don't rly need this -->
<!-- How about about section here? -->

<td align="left" id="tdAbout">

<!--Recent Changes --> <!-- NM -->
<div id="aboutDiv">
<p class="yellowboxtransparent" id="about">
Welcome to MZ's personal photography site. Here, you will find galleries of some of his photos, by pressing the Galleries link at the top right hand side of the page. Enjoy!

</p>
</div>

<!-- About --> </td>
<td>&nbsp;&nbsp;</td>
<td align="center">

<!--Slideshow-->
<div align="center" id="show" class="slideshow">
    <img src="images/1.jpg" alt="" />
  </div>

</td>
<td align="right">
</td>
</tr>

<tr><td><br><br></td></tr>

<tr><!--<td align="left"> -->

<!--Copyright Statement-->
<!--<p class="copy">&copy; Copyright 2009 by MZ. <br/>All Rights Reserved. </p>

</td><td align="right"><!--Links--><!--</td>--></tr></table>
</td>
<td><!--Right hand column -->
<div id="meDiv">
<p class="blueboxtransparent">

hi

</p>
</div>
</td>
</tr>
</table>
<br/><br/><br/><br/><br/>
<!-- Beneath -->

<div id="bottom">

<div class="leftfloat" id="divCopy">
<!--Copyright Statement-->
<p class="copy">&copy; Copyright 2009 by MZ. All Rights Reserved. </p>
</div>
<div class="rightfloat" id="divLinks">

<ul id="linklist">
<li><a href="http://absolutely2nothing.wordpress.com"&gt;Blog&lt;/a&gt;&lt;/li&gt;
<li><a href="http://twitter.com/maximz2005"&gt;Twitter - @maximz2005</a></li>

</ul>


</div>


</div>
</body>
</html>

The below is my css, in site.css.

/* CSS for MZ Photography site. Coypright 2009 by MZ, All Rights Reserved. */

p.copy { color:#ffffff; font-face:Helvetica,Calibri,Arial; font-size:12; font-style:italic;}

.leftfloat { float: left; }

.rightfloat { float: right; }

body {
font: 12px/1.5 Helvetica, Arial, "Lucida Grande", "Lucida Sans Unicode", Tahoma, sans-serif!important;
color: #ffffff;
background: #000000; }

#about { color: #3399FF; } /* #666 */

h1 { font: Helvetica, "Comic Sans MS", "Arial Rounded MT Bold", Tahoma, "Times New Roman"; font-size: 32pt; color: #339; }

h2 { font: Helvetica, Arial; font-size: 18pt; color: #666; }

a.hover { background-color:#666; color:#ffffff; }

#tdAbout { width:25 }

#nav { float:right }

#linklist
{
font-family: Calibri, Helvetica, Comic Sans MS, Arial, sans-serif;
list-style-type:circle;
white-space:nowrap;
}

#linklist li
{
display:inline


}


/* Warnings/Alerts */
.warning, .alert, .yellowbox {
padding: 6px 9px;
background: #fffbbc;
border: 1px solid #E6DB55;
}

.yellowboxtransparent, .warningtransparent, .alerttransparent { 
padding:6px 9px;
border: 1px solid #E6DB55;
}

/* Errors */
.error, .redbox {
padding: 6px 9px;
background: #ffebe8;
border: 1px solid #C00;
}

.redboxtransparent, .errortransparent{
padding: 6px 9px;
border: 1px solid #C00;
}

/* Downloads */
.download, .greenbox {
padding: 6px 9px;
background: #e7f7d3;
border: 1px solid #6c3;
}

.greenboxtransparent, .downloadtransparent {
padding: 6px 9px;
border: 1px solid #6c3;
}

/*Info Box */
.bluebox, .info{
padding: 6px 9px;
background: #FFFF33;
border: 2px solid #3399FF;
color: 000000;
}

.blueboxtransparent, .infotransparent{
padding: 6px 9px;
border: 1px solid #3399FF;
}

a:link {
COLOR: #DC143C; /* #0000FF */
}
a:visited {
COLOR: #DC143C; /* #800080 */
}
a:hover { color: #ffffff; background-color: #00BFFF; }
}
a:active { color: #ffffff; background-color: #00BFFF; }




/*Navigation*/
#Navigation {
float: right;
background: #192839 url(images/bg_nav_left.gif) left bottom no-repeat;
}

#Navigation ul {
float: left;
background: url(images/bg_nav_right.gif) right bottom no-repeat;
padding: 0 .8em 2px;
margin: 0;
}
#Navigation li {
float: left;
list-style: none;
margin: 0;
background: none;
padding: 0;
}
#Navigation li a {
float: left;
padding: 0 1em;
line-height: 25px;
font-size: 1.2em;
color: #D0D0D0;
text-decoration: none;
margin-bottom: 2px;
}
#Navigation li.current a, #Navigation li.current a:hover {
    border-bottom: 2px solid #176092;
    background: #192839;
    margin-bottom: 0;
    cursor: default;
    color: #D0D0D0;
}
#Navigation li a:hover {
color: #fff;
border-bottom: 2px solid #4082ae;
margin-bottom: 0;
}

#Navigation li.current a, #Navigation li.current a:hover {
    border-bottom: 2px solid #176092;
    background: #192839;
    margin-bottom: 0;
    cursor: default;
    color: #D0D0D0;
}

Thanks so much in advance for all your help!

A: 

I haven't tested this, but I think it should work:

$(document).ready(function() {

  //first method
  $(".NavSubhead").hide();

  $('#Navigation li').hover(
    function(){$('div.NavSubhead', this).fadeIn(500);},
    function(){$('div.NavSubhead', this).fadeOut(500);}
  );
}
Marius
Testing... thanks in advance! going to report back with results.
Maxim Zaslavsky
Nope, not working, but that you for helping anyway! However, the code looks *right* to my untrained eye... can anybody enlighten me as to why this isn't working either? Thanks!
Maxim Zaslavsky
Sorry, I meant "but thank you for helping anyway", misspelled "thank".
Maxim Zaslavsky
I fixed a few other possible errors in my code, still not working...
Maxim Zaslavsky
+1  A: 

This worked for me. You should probably be consistent in your markup though and have the hidden text appear after its associated link in both cases.

$(document).ready(function()
{
    $('.NavSubhead').hide();

    $('li.hovertriggerssubhead').hover(
     function()
     {
      $('.NavSubhead', $(this)).show();
     },
     function()
     {
      $('.NavSubhead', $(this)).hide();
     }
    );
});
Stephen Curran
Thank you, but I'm having trouble even with using the working demo below, so once I figure out what's going on I'll attempt your way. Thanks again!
Maxim Zaslavsky
+2  A: 

Working Demo

jQuery code

$(function() {

  $("div.NavSubhead").hide();

  $('#Navigation li a').hover(
    function(){$(this).next().stop(false, true).fadeIn(500);},
    function(){$(this).next().stop(false, true).fadeOut(500);}
  );

});

N.B. I have added a click event handler to prevent the default action on anchor elements in the demo too

You may also want to chain in a slideDown() and slideUp() before the fade command in each event handler, respectively, to make the animation smoother

  $('#Navigation li a').hover(
    function(){$(this).next().stop(false, true).slideDown().fadeIn(500);},
    function(){$(this).next().stop(false, true).slideUp().fadeOut(500);}
  );

You may also want to take a look at the jQuery accordion, which essentially does what you are doing here, but has some additional options too.

EDIT:

After both of your updates, I know what the problem is. The slideshow plugin that you are using is for the Mootools JavaScript framework. The code supplied here is for the jQuery JavaScript framework. Whilst it is fine to use both frameworks on your site on the same page, both frameworks assign an object to $ to use for selection, and the object in each case has different methods, properties, etc. So, to get both frameworks to work at the same time we need to avoid this conflict. Luckily, jQuery has a command to easily get around this, noConflict(), which will release the $ shorthand so that other frameworks can use it. Take particular note of the order in which it must be included in a page.

So to get the code working, the structure of the scripts will need to be as follows

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"&gt;&lt;/script&gt;

<script type="text/javascript">
    // you can assign the jQuery object to another name if you want. Just
    // use var $j = jQuery.noConflict() and then can use $j() for jQuery object.
    jQuery.noConflict(); 

    // now your jQuery stuff comes here
    // there are a couple of techniques that can be used so that you can use the $
    // shorthand with jQuery library. I'll show you one here using a self-invoking
    // anonymous function that takes one parameter, $, into which we will pass the
    // the jQuery object

    (function($) {
      $(function() {

        $("div.NavSubhead").hide();

        $('#Navigation li a').hover(
            function(){$(this).next().stop(false, true).fadeIn(500);},
            function(){$(this).next().stop(false, true).fadeOut(500);}
        );

      });
    })(jQuery); 

    // now put the Mootools script and relevant slideshow script.
    <script src="....." ></script>

    ....

There are plenty of great slideshow and lightbox plugins for jQuery that offer similar effects to the Mootools one that you have linked to.

I'm of the opinion that, unless absolutely necessary for some specific functional need, I stick to using just one JavaScript framework in my site. Not only does this avoid conflicts, but there are usually ways built into a framework of achieving what another framework does. Even if a framework does not have that functionality as part of the core library, frameworks are designed to be extensible and as such, have an architecture that allows one to develop plugins and extend functionality to fit ones needs.

Russ Cam
I pasted this code in, as well as trying the demo code, but it still doesn't work, which is very weird. Could it be related by any chance to constraints of the navigation html because of an encompassing table? The table has a fixed width. Other than that, I don't know what is the problem, and JQuery is referenced correctly.
Maxim Zaslavsky
did the demo work for you? Is jQuery referenced correctly in your page - you can test this with a simple $(function() { alert("hello"); }); which should bring up an alert dialog when the DOM has finished loading.
Russ Cam
I thought that too, but tested it with an alert not wrapped into a function, so i think it didn't verify it - i'm going to try that right now...
Maxim Zaslavsky
Yes, JQuery works, but only when not in the document.ready function - is this correct? Oh, and I've been placing the code that you posted as an answer into the document.ready function, but it doesn't work even if you place it outside of document.ready. What gives?
Maxim Zaslavsky
Sorry, I mean that the hello alert worked, but only when not in document.ready - jquery is working.
Maxim Zaslavsky
If the hello alert worked but not wrapped in document ready then that sounds like jQuery is not referenced correctly as if it was, the alert would work wrapped in the document ready function. Are you using other JavaScript frameworks? Can you post all of your page code (if not too big)?
Russ Cam
Sure! However, it has some other javascript code for a slideshow using a framework. I'll update the question with the code.
Maxim Zaslavsky
Thank you so much for this prompt and simple solution - I will look into using a JQuery slideshow plugin instead in the future. The noConflict() code you posted works wonders. Have a great day!
Maxim Zaslavsky