11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je vous sollicite car j'ai un petit problème. J'ai une galerie réalisé en jquery avec un menu (web, print, logos, divers, etc) et plusieurs images. Lorsque l'on clic sur un menu, les images qui correspondent à leur catégorie s'affiche. mon soucis est que le menu marche avec une certaine librairie javascript et l'ouverture de la popup (qui s'affiche au clic d'une image) avec une autre librairie...
Il n'y a pas d'erreurs javascript mais je pense que ces deux librairies entrent en conflit puisque selon l'ordre dans lesquels je les appellent, le menu marche ou le popup marche mais jamais les deux en même temps Smiley ohwell
Que puis-je faire pour les faire fonctionner toutes les deux ?

Voici mon code :


<!doctype html>
<html lang="fr">
    <head>
        <link href='http://fonts.googleapis.com/css?family=Lato:100,300,400,700,900,100italic,300italic,400italic,700italic,900italic,bold,bolditalic,italic' rel='stylesheet' type='text/css'>
		<link href='http://fonts.googleapis.com/css?family=Ropa+Sans' rel='stylesheet' type='text/css'>
		<link href='https://fonts.googleapis.com/css?family=Archivo+Narrow:400,400italic,700,700italic' rel='stylesheet' type='text/css'>
		<link href='https://fonts.googleapis.com/css?family=Roboto:400,700,500' rel='stylesheet' type='text/css'>
        <link href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
		
        <meta name="robots" content="noindex">
        <title>Test</title>
 
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1; charset=utf-8">
        <meta name="description" content="">
        <meta name="author" content="">
        <meta name="viewport" content="width=device-width">
		
        <link rel="stylesheet" href="css/normalize.css">
        <link rel="stylesheet" href="css/grid.css">
		<link rel="stylesheet" type="text/css" href="css/style.css">
        <link rel="stylesheet" href="css/responsive.css">
		
		<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
		<script type="text/javascript" charset="utf-8" src="js/jquery.quicksand.js"></script>
		<script type="text/javascript" charset="utf-8" src="js/sorting.js"></script>
		<script src="js/lightbox-image.js" type="text/javascript"></script>
		
		<link rel="shortcut icon" type="image/x-icon" href="img/favicon.ico" />
		
		
		
		<script>
			$(document).ready(function() {
				$('.scrollTo').click( function() { // Au clic sur un élément
				var page = $(this).attr('href'); // Page cible
				var speed = 900; // Durée de l'animation (en ms)
				$('html, body').animate( { scrollTop: $(page).offset().top }, speed ); // Go
				return false;
				});
			});
		</script>
    </head>
	
	<body class="home">
		
			<!--============ JAVASCRIPT ============-->
			
			<script type="text/javascript">
			WebFontConfig = {
			google: { families: [ 'Roboto:400,700,500:latin' ] }
			};
			(function() {
			var wf = document.createElement('script');
			wf.src = 'https://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';
			wf.type = 'text/javascript';
			wf.async = 'true';
			var s = document.getElementsByTagName('script')[0];
			s.parentNode.insertBefore(wf, s);
			})();
			
			WebFontConfig = {
			google: { families: [ 'Archivo+Narrow:400,400italic,700,700italic:latin' ] }
			};
			(function() {
			var wf = document.createElement('script');
			wf.src = 'https://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';
			wf.type = 'text/javascript';
			wf.async = 'true';
			var s = document.getElementsByTagName('script')[0];
			s.parentNode.insertBefore(wf, s);
			})();
			 
			WebFontConfig = {
			google: { families: [ 'Ropa+Sans::latin' ] }
			};
			(function() {
			var wf = document.createElement('script');
			wf.src = ('https:' == document.location.protocol ? 'https' : 'http') +
			  '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';
			wf.type = 'text/javascript';
			wf.async = 'true';
			var s = document.getElementsByTagName('script')[0];
			s.parentNode.insertBefore(wf, s);
			})(); 
			
			  WebFontConfig = {
			google: { families: [ 'Lato:400,300:latin' ] }
		  };
		  (function() {
			var wf = document.createElement('script');
			wf.src = 'https://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';
			wf.type = 'text/javascript';
			wf.async = 'true';
			var s = document.getElementsByTagName('script')[0];
			s.parentNode.insertBefore(wf, s);
		  })();
		  
		  //PopUp
		$(document).ready(function() {
			//Lorsque vous cliquez sur un lien de la classe poplight
			$('a.poplight').on('click', function() {
				var popID = $(this).data('rel'); //Trouver la pop-up correspondante
				var popWidth = $(this).data('width'); //Trouver la largeur

				//Faire apparaitre la pop-up et ajouter le bouton de fermeture
				$('#' + popID).fadeIn().css({ 'width': popWidth}).prepend('<a href="#" class="close"><img src="" class="btn_close" title="" alt="" /></a>');
				
				//Récupération du margin, qui permettra de centrer la fenêtre - on ajuste de 80px en conformité avec le CSS
				var popMargTop = ($('#' + popID).height() + 80) / 2;
				var popMargLeft = ($('#' + popID).width() + 80) / 2;
				
				//Apply Margin to Popup
				$('#' + popID).css({ 
					'margin-top' : -popMargTop,
					'margin-left' : -popMargLeft
				});
				
				//Apparition du fond - .css({'filter' : 'alpha(opacity=80)'}) pour corriger les bogues d'anciennes versions de IE
				$('body').append('<div id="fade"></div>');
				$('#fade').css({'filter' : 'alpha(opacity=80)'}).fadeIn();
				
				return false;
			});
	
			//Close Popups and Fade Layer
			$('body').on('click', 'a.close, #fade', function() { //Au clic sur le body...
					$('#fade , .popup_block').fadeOut(function() {
						$('#fade, a.close').remove();  
				}); //...ils disparaissent ensemble
					
					return false;
			});
		});
		
		</script>


Merci d'avance.
Modifié par Kev92100 (13 Mar 2016 - 18:04)
Bonjour et bienvenue sur le forum,

Déjà, essaie de virer l'appel au deuxième jQuery, quitte à faire, garde la version la plus récente (1.9.1)...

Est-ce que ça arrange déjà des choses ?
Kev92100 a écrit :
Je dois forcément laisser les deux librairies.

Pour quelle raison ?
Modifié par SolidSnake (09 Mar 2016 - 10:42)
Car si j'enlève la librairie 1.9.1 l'ouverture de popup ne marche plus. Si j'enlève la 1.7.2, c'est le menu qui ne marche plus Smiley ohwell
L'ouverture du popup marche mais lorsque l'on clic sur le menu ("print" par exemple), l'ouverture du popup ne marche plus...
Modifié par Kev92100 (13 Mar 2016 - 18:06)
Essaie de remplacer ça :
$('a.poplight').on('click', function() { ... } )

Par ça :
$('body').on('click', 'a.poplight', function() { ... } )
Bonjour,

La meilleure réponse qu'on peut apporter à ce genre de problème est aussi celle qui risque de plaire le moins. J'ai récemment découvert AMD, et malheureusement je crois que c'est vraiment une des meilleures façons de régler définitivement ce genre de conflit autrement indébloquable. ON commence à comprendre qu'il faut arrêter la soupe de balises HTML, mais il faudrait qu'on arrête aussi de faire de la soupe de JavaScript.


Perso je ne suis pas fan de JQuery, j'aime pas trop son tronc en mode monolithique qui apporte certes 10% de fonctions indispensables, mais 90% de trucs pas nécessairement aussi importants, donc je ne pourai pas aider plus sur le problème de fond.
Par contre les nouvelles versions de JQuery sont censé être compatibles AMD et je pense que ce serait vraiment la bonne façon de faire à l'avenir.
SolidSnake a écrit :
Essaie de remplacer ça :
cas1
$('a.poplight').on('click', function() { ... } )

Par ça :
cas2
$('body').on('click', 'a.poplight', function() { ... } )


JQuery par defaut utilise le mode buble upward mais Jquery est il ecris en utilisant quelle syntaxe ? ( il suit la sienne ou un des " standart" cjs amd umd ? ) . Jquery est compatible CommonJS( server node) et AMD( client web) mais seule UMD supporte les deux à la fois CJS et AMD . AMD semble entourer le code JQuery .

@SolidSnake : qu est la logique du code ici ?
cas 1 : this=event.target ?
cas 2 : this != event .Target ?
Est il possible de détecter précisément l endroit ( debug= N° ligne et N° colonne) ou sa bloque .Je suppose au niveau de la mémoire ou de la gestion des évènements ( bubble ? , capture ? / event.target ? ..... )

@Kev92100 : Est que l alternative proposé par @SolidSnake a fonctionnée ?

tout ça est un problème d 'écriture/structuration/style du code pour palier le fait que javascript n'est pas modulaire . Plusieurs façons d'écrire le code ( pattern) en utilisant selon les cas différentes syntaxe de déclaration/Appel-loader : namespace , AMD, CJS , UMD , ES6 .
y aurait il pas un moyen de modifier le fichier jquery.min.js pour que celui ci puisse être appeler avec une variable de nom différente de de l alias $ : voir utiliser la fonction jquery noconflict ?

le mot clé être "organiser" avec javascript module et class video fevrier 2013
Modifié par 75lionel (17 Mar 2016 - 10:45)
Arf, j'ai à chaque fois mal à la tête quand je te lis, je comprends à moitié ce dont tu parles.

Bref, pour répondre à ta question (qu est la logique du code ici ?), la réponse est la délégation (Delegated events).

J'ai remarqué que dans les plugin utilisés, il y a un quicksand, et il doit cloner des objets, donc avec le cas 1, tu perds l'event attaché, alors que dans le cas 2, non (puisqu'il est sur un parent)
C'est tout.

Après, je n'ai pas de nouvelle depuis 8 jours du demandeur, donc pas la peine de s'obstiné sur le problème...
Bonjour,

Merci pour vos réponses. Désolé je ne m'y connait pas très bien mais un ami a réglé le problème. Il a réécrit le code jquery car d'après lui c'était un problème d'écriture justement. Sorry j'en sais pas vraiment plus.
Modifié par Kev92100 (18 Mar 2016 - 10:56)