Jquerry : TypeError: $(...).offset(...) is undefined

Jquerry : TypeError: $(...).offset(...) is undefined - HTML/CSS - Programmation

Marsh Posté le 30-12-2015 à 16:36:56    

Bonjour a tous. ;)   :jap:  
 
Je me suis lancé dans la création d'un site web, et je suis totalement novice.  :sarcastic:  
Je bloque sur un truc qui va tres certainement vous paraitre évident ^^
 
J ai un petit script pour que le div menu suive le scroll a partir d'un certain point. D'apres mes recherche, c'est pas faisable avec du CSS donc je me suis tourné vers d autres moyens.
 
J ai une erreur : TypeError: $(...).offset(...) is undefined  a la ligne 5 "var menu = $('#menu').offset().top;":o  
 
Si une ame charitable pouvait me dépatouiller de cette galere ! ^^  
 
 
Le Jquery :

Code :
  1. <script language="JavaScript" type="text/javascript" src="file://C:/Users/Ehones4/Desktop/jQuery v2.1.4.js"></script>
  2. <script>
  3. var menu = $('#menu').offset().top;
  4. $(window).scroll(
  5. function() {
  6.  if ($(window).scrollTop() > 100) {
  7.   // fixed  
  8.   $('menu').addClass("floatable" );
  9.  } else {
  10.   // relative
  11.   $('menu').removeClass("floatable" );
  12.  }
  13. }
  14. );
  15. </script>


 
le CSS :

Code :
  1. #menu
  2. {
  3. height:60px;
  4. background-color:grey;
  5. width:1000px;
  6. top:130;
  7. margin-left: auto;
  8. margin-right: auto;
  9. font-family: Verdana;
  10. color: white;
  11. opacity:0.5;
  12. }
  13. #menu a /* Contenu des listes */
  14. {
  15. display : block;
  16. height:20px; /* barre verticale */
  17. padding-right : 0.5em;
  18. padding-left : 0.5em;
  19. text-decoration : none;
  20. padding: 12px;
  21. }
  22. #menu li /* Barre vericale * */     
  23. {
  24. border-right:1px solid #FFF;
  25. padding:0 4px;
  26. z-index:2;
  27. }
  28. #nav {
  29. top:0;
  30. font-family: Verdana;
  31. }
  32. #nav li {
  33. display: inline;
  34. list-style: none;
  35. }
  36. #nav a {
  37. display:inline-block;
  38. color: white;
  39. }


 
l'HTML :

Code :
  1. <div id="menu">
  2.                 <ul id="nav">
  3.               <ul>
  4.   <li class="nav-item"><a href="index.html"><SPAN style=" left: 250px;width: 103px; height: 61px">
  5. <IMG SRC="file:///C:/Users/Ehones4/Desktop/Nouveau%20dossier%20%284%29/Images/home.png">
  6. </SPAN></a></li>
  7.                         <li class="nav-item"><a href="index.html">BLALBLA</a></li>
  8.   <li class="nav-item"><a href="Presentation.html">PRESENTATION</a></li>
  9.                         <li class="nav-item"><a href="Stages.html">STAGES</a></li>
  10.                         <li class="nav-item"><a href="Tarif.html">TARIFS</a></li>
  11.              <li class="nav-item"><a href="Planning.html">PLANNING</a></li>
  12.   <li class="nav-item"><a href="Contacts.html">CONTACTS</a></li>
  13.                     </ul>
  14.         </ul>
  15. </div>
  16. </body>
  17. </html>


Message édité par ehones le 30-12-2015 à 17:06:50
Reply

Marsh Posté le 30-12-2015 à 16:36:56   

Reply

Marsh Posté le 30-12-2015 à 19:50:27    

désolé d'up aussi vite, mais ca m'ennuie vraiment cet histoire :3

Reply

Marsh Posté le 30-12-2015 à 20:02:45    

:hello:  
 
A vue d'oeil tu appelles ton offset alors que la page n'est pas encore chargée :
1 - tu places ton code dans une fonction " $(document).ready(function() {}); "
2 - bienvenue dans le monde de la programmation où tu dois systématiquement vérifier que tes variables existent avant de les utiliser " var menu = $('#menu').offset().top;
    if (menu.length) {  //ton code } "
3 - <script language="JavaScript" type="text/javascript" src="file://C:/Users/Ehones4/Desktop/jQuery v2.1.4.js"></script>
Est une horreur car "language" n'est plus utilisé depuis un bail, de plus le type est tout le temps du JS donc t'es pas obligé de le mettre (HTML5)
 
EDIT 4 - Tu as un fichier CSS mais pourtant tu utilises une balise "style" je me demande bien pourquoi?

Code :
  1. $(document).ready(function() {
  2.     var menu = $('#menu').offset().top;
  3.     if (menu.length) {
  4.         $(window).scroll(
  5.             function() {
  6.                 if ($(window).scrollTop() > 100) {
  7.                     // fixed   
  8.                     $('menu').addClass("floatable" );
  9.                 } else {
  10.                     // relative
  11.                     $('menu').removeClass("floatable" );
  12.                 }
  13.             }
  14.         );
  15.     }
  16. });

Message cité 1 fois
Message édité par caps lock le 30-12-2015 à 20:04:59
Reply

Marsh Posté le 30-12-2015 à 20:18:52    

Merci !
J ai enlever le style inutile et j'ai corrigé le script.
La console ne m'indique plus d erreur, mais le script ne fonctionne toujours pas :/

Reply

Marsh Posté le 31-12-2015 à 04:04:30    

Oui, je t'ai juste aidé à comprendre ton erreur. Maintenant tu rajoutes une classe à ta balise "menu" mais elle n'existe même pas dans ton CSS  :sweat:  
Il ne suffit pas de copier/coller du code si tu me comprends pas ce que tu fais
regarde par ici : http://manos.malihu.gr/jquery-floating-menu/

Reply

Marsh Posté le 31-12-2015 à 08:17:10    

caps lock a écrit :

:hello:  
 
A vue d'oeil tu appelles ton offset alors que la page n'est pas encore chargée :
1 - tu places ton code dans une fonction " $(document).ready(function() {}); "
2 - bienvenue dans le monde de la programmation où tu dois systématiquement vérifier que tes variables existent avant de les utiliser " var menu = $('#menu').offset().top;
    if (menu.length) {  //ton code } "
3 - <script language="JavaScript" type="text/javascript" src="file://C:/Users/Ehones4/Desktop/jQuery v2.1.4.js"></script>
Est une horreur car "language" n'est plus utilisé depuis un bail, de plus le type est tout le temps du JS donc t'es pas obligé de le mettre (HTML5)
 
EDIT 4 - Tu as un fichier CSS mais pourtant tu utilises une balise "style" je me demande bien pourquoi?

Code :
  1. $(document).ready(function() {
  2.     var menu = $('#menu').offset().top;
  3.     if (menu.length) {
  4.         $(window).scroll(
  5.             function() {
  6.                 if ($(window).scrollTop() > 100) {
  7.                     // fixed   
  8.                     $('menu').addClass("floatable" );
  9.                 } else {
  10.                     // relative
  11.                     $('menu').removeClass("floatable" );
  12.                 }
  13.             }
  14.         );
  15.     }
  16. });



1- Pas besoin dans son cas de le mettre dans un document.ready si son code est à la fin de la page
2- C'est une erreur courante de vouloir tester le .length d'un objet jquery, étant donné que jquery s'en fout et que tu aies 0 ou N élément dans la collection jquery il n'y a pas besoin de faire un if($jQueryObject.length).

Reply

Marsh Posté le 31-12-2015 à 12:18:27    

caps lock a écrit :

Oui, je t'ai juste aidé à comprendre ton erreur. Maintenant tu rajoutes une classe à ta balise "menu" mais elle n'existe même pas dans ton CSS  :sweat:
Il ne suffit pas de copier/coller du code si tu me comprends pas ce que tu fais
regarde par ici : http://manos.malihu.gr/jquery-floating-menu/

 

Dans le CSS, je dois creer #menu.fixed c'est bien ca?


Message édité par ehones le 31-12-2015 à 12:22:28
Reply

Marsh Posté le 01-01-2016 à 00:27:35    

gatsu35>
1 - on ne sait pas comment il a bidouillé sa mise en page de code
2 - oui très bonne remarque!
 
ehones>
Oui tout à fait !  
Le HTML est le fond, le CSS la forme, puis le JavaScript te permet d'interagir avec le document.
Ici quand tu scroll sur ta page, tu rajoutes ou tu enlèves une classe à ton menu, il faut donc qu'elle existe dans ton css

Reply

Marsh Posté le 01-01-2016 à 23:52:39    

Salut, et bonne année !

 

J ai réussi a faire fonctionner le script, mais il y a un détail qui me chiffonne encore :/
En fait, lorsque j atteints le point ou le menu devient fixed, la page scroll brutalement vers le bas, d'une cinquentaine de pixel.
Je trouve pas ca très esthétique, et je ne comprend pas pourquoi cela fait ca.
Si vous pouviez me donner une piste pour résoudre ce pb :pt1cable:

 

Le CSS

 
Code :
  1. #menu{
  2. position: relative;
  3. border-radius: 15px;
  4. height:60px;
  5. width: 1000;
  6. box-shadow: -1px 2px 5px 1px rgba(0, 0, 0, 0.7);
  7. box-shadow: -1px 2px 10px 3px rgba(0, 0, 0, 0.3) inset;
  8. box-shadow: -1px 2px 5px 1px rgba(0, 0, 0, 0.7),
  9.             -1px 2px 20px rgba(0, 0, 0, 0.6) inset;
  10. border-width:2px;
  11. border-style:solid;
  12. border-color:black;
  13. border-radius: 15px;
  14. font-family: Verdana;
  15. margin: 0 auto;
  16. top:100;
  17. z-index:1;
  18. opacity:1;
  19. background-color:black;
  20. }
  21. #menu.fixed{
  22. display:block
  23. border-width:2px;
  24. border-style:solid;
  25. opacity:1;
  26. margin: 0 auto;
  27. background-color:black;
  28. left : 50%;
  29. margin-left : -502px;
  30. top : 0px;
  31. width:1000px;
  32. height: 60px;
  33. position: fixed;
  34. z-index:1;
  35. }
 


Le JS

Code :
  1. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
  2. <script type="text/javascript">
  3.     $(document).ready(function($){
  4.         menu = $('#menu');
  5.     $(window).scroll(function(event){
  6.         windowScroll = $(window).scrollTop();
  7.         if( $(window).scrollTop() >= 100 ){
  8.             menu.addClass('fixed');
  9.         } else {
  10.             menu.removeClass('fixed');
  11.         }
  12.     });
  13. });
  14. </script>


Message édité par ehones le 01-01-2016 à 23:54:00
Reply

Marsh Posté le 02-01-2016 à 00:13:59    

La réponse est simple, comme tu supprime le menu du flux, alors le flux remonte d'autant de la hauteur de pixel. Pour corriger ton problème tu pourrais rajouter un padding-top ou rajouter un div vide qui ferait la hauteur du menu à la place.
 

Reply

Marsh Posté le 02-01-2016 à 00:13:59   

Reply

Marsh Posté le 02-01-2016 à 01:02:55    

Un padding top? C'est l'espacement interieur du haut d'un div?
J ai testé en le rajoutant dans menu.fixed, ca agrandit la div, mais ya toujours le flux qui remonte.
 
Pour la deuxieme méthode, je doit faire apparaitre le div uniquement lorsque je scroll non?

Reply

Marsh Posté le 02-01-2016 à 01:11:05    

ehones a écrit :

Un padding top? C'est l'espacement interieur du haut d'un div?
J ai testé en le rajoutant dans menu.fixed, ca agrandit la div, mais ya toujours le flux qui remonte.
 
Pour la deuxieme méthode, je doit faire apparaitre le div uniquement lorsque je scroll non?


J'ai dis un padding-top sur le parent de menu Car tu enleve le menu du flux, donc tu dois ajouter quelque chose sur le parent ou le body pour éviter cette rémontée.
 
Mais je pense qu'il y a plus simple.  
Au lieu d'ajouter une classe sur menu.fixed, ajoute une classe "menu-fixed" sur le body, ainsi tu pourras modifier ce que tu veux au niveau CSS :  
 
 

Code :
  1. #menu.fixed

devient  

Code :
  1. .menu-fixed #menu


et tu rajoutes ça dans ta css :  

Code :
  1. .menu-fixed body {
  2.    padding-top:60px; (la hauteur du menu quoi)
  3. }


 
nettoie un peu ta CSS, tu peux supprimer les 2 premières lignes de box-shadow, elles ne servent à rien, seule la dernière sera prise en compte.
et ton width doit avoir des unités, dont met 1000px au lieu de 1000.

Reply

Marsh Posté le 02-01-2016 à 01:28:16    

Ok merci beaucoup :)

 

Mais du coup, faut corriger le script ici?

Code :
  1. menu.addClass('fixed');
  2.         } else {
  3. menu.removeClass('fixed');

Message cité 1 fois
Message édité par ehones le 02-01-2016 à 01:28:42
Reply

Marsh Posté le 02-01-2016 à 01:30:37    

ehones a écrit :

Ok merci beaucoup :)
 
Mais du coup, faut corriger le script ici?

Code :
  1. menu.addClass('fixed');
  2.         } else {
  3. menu.removeClass('fixed');



remplace menu par $('#body')

Reply

Marsh Posté le 02-01-2016 à 01:38:11    


Je dois oublier quelque chose, ca fonctionne pas   :heink:

 
Code :
  1. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
  2. <script type="text/javascript">
  3.     $(document).ready(function($){
  4.         body = $('#body');
  5.     $(window).scroll(function(event){
  6.          windowScroll = $(window).scrollTop();
  7.         if( $(window).scrollTop() >= 100 ){
  8.             body.addClass('menu-fixed');
  9.         } else {
  10.             body.removeClass('menu-fixed');
  11. }
  12.     });
  13. });
 
Code :
  1. body {
  2. background-image:url(file:///C:/Users/Ehones4/Desktop/Nouveau%20dossier%20%284%29/Images/fond.jpg);
  3. background-attachment:fixed;
  4. }
  5. .menu-fixed body {
  6. padding-top:60px;
  7. }
  8. #menu{
  9. position: relative;
  10. border-radius: 15px;
  11. height:60px;
  12. width: 1000px;
  13. box-shadow: -1px 2px 5px 1px rgba(0, 0, 0, 0.7),-1px 2px 20px rgba(0, 0, 0, 0.6) inset;
  14. border-width:2px;
  15. border-style:solid;
  16. border-color:black;
  17. border-radius: 15px;
  18. font-family: Verdana;
  19. margin: 0 auto;
  20. top:100px;
  21. z-index:1;
  22. opacity:1;
  23. background-color:black;
  24. }
  25. .menu-fixed #menu{
  26. display:block
  27. border-width:2px;
  28. border-style:solid;
  29. opacity:1;
  30. margin: 0 auto;
  31. background-color:black;
  32. left : 50%;
  33. margin-left : -502px;
  34. padding-top:10px;
  35. top : 30px;
  36. width:1000px;
  37. height: 60px;
  38. position: fixed;
  39. z-index:1;
  40. }


Message édité par ehones le 02-01-2016 à 01:39:06
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed