11544 sujets

JavaScript, DOM et API Web HTML5

Je cherche à afficher un div (qui suit le curseur) au survol d'un lien ou d'une image.
J'aimerais faire ca en AJAX pour ne pas avoir à créer au chargement de la page tout les div à afficher ...
En fait ce DIV serait créer par une page PHP qui irait chercher les données dans une base MYSQL.

La composition :
Index.php // Avec les liens/image, un ID par lien
affichage_id.php // Page qui recoit un ID en GET/POST pour créer le div

J'ai lus beaucoup de tutoriaux, mais j'ai laissé tombé, lire et comprendre 5 pages pour finalement avoir un exemple qui ne fonctionne pas est inutile.
Avez vous déjà vu exemple qui fonctionne ? moi jamais ... et je suis loin d'être le seul, à croire qu'AJAX est un secret ...
Modifié par SpaceCowboy (10 Mar 2008 - 23:59)
Sans vouloir précher pour la paroisse des outils que j'utilise, choisir un framework javascript permet de grandement simplifier les tâches Ajax. J'utilise personnellement mootools pour plein de raisons que je n'exposerai pas ici (d'autres frameworks comme JQuery, Prototype doivent le faire mais je n'en connais pas la syntaxe).

Un exemple avec mootools :
var url='urlDuPhp/QuiGenere/DuTexte.php';

var maRequete = new Ajax(url,{
   method : 'get',
   update : $('maDivInfoBulle')
});

maRequete.request('infoBulle=1'); //Ici en paramètre une queryString si l'on veut envoyer des paramètres au fichier php

//Eventuellement plus tard
maRequete.request('infoBulle=2');


permet d'aller interroger le serveur de façon assez simple. Après il est possible d'etoffer, de gérer les erreurs, etc... en y ajoutant bien sur la gestion des evenements pour lancer la requete au moment du survol du lien ou de l'image...
Modifié par skywalk3r (11 Mar 2008 - 09:55)
Modérateur
Bonjour aussi, Smiley jap

Vu que je m'étais amusé à faire un script similaire, je te laisse un "petit" exemple (bien que ce ne soit pas dans les habitudes du forum) où je récupère le contenu de la page vers laquelle le lien pointe...
Nota: Tu seras contraint de potasser le script car ce sera à adapter à ton cas donc n'hésite pas à revenir en cas d'incompréhension. Smiley cligne

index.php
<?php

header('content-type: text/html; charset=utf-8');

?><!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" xml:lang="fr" lang="fr">
	<head>
		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
		<title>INFOBULLE QUI SUIT LA SOURIS</title>
		<link rel="stylesheet" media="screen, projection" type="text/css" href="style.css" />
		<script type="text/javascript" src="script.js"></script>
	</head>
	<body>

<div id="cont">
	<p><a href="lien.php">lien vers une autre page</a></p>
</div>

	</body>
</html>

lien.php
<?php

header('content-type: text/html; charset=utf-8');
if(!isset($_GET['ajax'])) {

?><!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" xml:lang="fr" lang="fr">
	<head>
		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
		<title>INFOBULLE QUI SUIT LA SOURIS</title>
		<link rel=stylesheet" media="screen, projection" type="text/css" href="style.css" />
		<script type="text/javascript" src="script.js"></script>
	</head>
	<body><?php

}

?>
<div id="info">
	<h1>Un titre</h1>
	<p>Le paragraphe correspondant</p>
</div><?php

if(!isset($_GET['ajax'])) {

?>
	</body>
</html><?php

}

?>

style.css
.hasJS #info {position:absolute; border:1px solid #000; background-color:#ddd; padding:10px;}
.hasJS .hidden {display:none;}
.hasJS #cont {position:relative;}
h1 {font-size:1em;}

script.js
/** *********************************************************************************************************
    BIBLIOTHEQUE
*/

(function() {

/** *********************************************************************************************************
     REMPLACEMENT DES METHODES getElementById ET getElementsByTagName
     EXEMPLES :
	var oEl = $('test');              // retourne l'objet ayant l'id 'test'
	var oEl2 = $(oEl);               // retourne oEl
	var aEls = $(oEl, 'a');         // retourne tous les liens de oEl
	var aEls2 = $('test', 'a');    // retourne tous les liens du conteneur ayant pour id 'test'
	var oEl3 = $(oEl, 'a')[0];    // retourne le premier lien de oEl
*/

var $ = {
	select: function() {
		var aArgs = arguments;
		if(aArgs.length > 1 && typeof aArgs[1] == 'string') {
			return typeof aArgs[0] == 'string' ?
				document.getElementById(aArgs[0]).getElementsByTagName(aArgs[1]):
				aArgs[0].getElementsByTagName(aArgs[1]);
		}
		else switch(typeof aArgs[0]) {
			case 'string':
				return document.getElementById(aArgs[0]);
			case 'object':
				return aArgs[0];
		}
		return false;
	}
};

/** *********************************************************************************************************
    OBJET DE GESTION DE CLASSE - INSPIRE DE  http://www.onlinetools.org/articles/unobtrusivejavascript/cssjsseparation.html
 
    EXEMPLES :
	$c.add(oEl, 'test');                    //  Ajout d'une classe a l'element oEl
	$c.has(oEl, 'test');                    //  Verification de l'existence de la classe 'test' sur l'element oEl via une chaine texte
	$c.has(oEl, /\btest\b/);             //  Verification de l'existence de la classe 'test' sur l'element oEl via une expression reguliere
	$c.swap(oEl, 'test', 'test2');      //  Modification de la classe 'test' de l'element oEl en classe 'test2' (ou inversement)
	$c.remove(oEl, 'test2');            //  Suppression de la classe 'test2' de l'element oEl
 */

var $c = {
	remove: function(oEl, sClass) {
		var rep = oEl.className.match(' ' + sClass) ? ' ' + sClass : sClass;
		oEl.className = oEl.className.replace(rep, '');
	},
	add: function(oEl, sClass) {
		if(!$c.has(oEl, sClass))
			oEl.className += oEl.className ? ' ' + sClass : sClass;
	},
	swap: function(oEl, sClass1, sClass2) {
		oEl.className = !$c.has(oEl, sClass1) ?
			oEl.className.replace(sClass2, sClass1):
			oEl.className.replace(sClass1, sClass2);
	},
	has: function() {
		return typeof arguments[1] == 'string' ?
			new RegExp('\\b' + arguments[1] + '\\b').test(arguments[0].className):
			arguments[1].test(arguments[0].className);
	}
};

/** *********************************************************************************************************
    GESTIONNAIRE D'EVENEMENT
    EXEMPLES :
	$e.add('domready', alerte);                                                    // Lance le gestionnaire alerte au chargement de la page
	$e.add(oEl, 'click', alerte);                                                     // Ajoute le gestionnaire alerte au clic sur oEl en mode 'effervescence'
	$e.add(oEl, 'click', alerte, true);                                             // Ajoute le gestionnaire alerte au clic sur oEl en mode 'capture' (IE ne sait pas faire)
	$e.remove(oEl, 'click', alerte);                                               // Supprime le gestionnaire alerte au clic sur oEl
	$e.add(oEl, 'click', function(e) { $e.stop(e); });                        // Si oEl est un lien, $e.stop(e); stoppe la transmission de l'evenement et annule l'action normale du lien
	$e.add(oEl, 'click', function(e) { alert($e.getSrc(e)); });            // Retourne la source de l'evenement
	$e.add(oEl, 'mouseover', function(e) { alert($e.relSrc(e)); });    // Retourne l'element survole precedent le mouseover
	$e.add(oEl, 'mouseout', function(e) { alert($e.relSrc(e)); });     // Retourne l'element survole suivant le mouseout
*/

var $e = {
	// Ajout d'un gestionnaire d'evenement sur un element lors d'un evenement donne
	add: function() {
		var a = arguments;
		if(a[0] == 'domready')
			return $e.domready(a[1]);
		return document.addEventListener ?
			a[0].addEventListener(a[1], a[2], a[3] || false):
			a[0].attachEvent ?
				a[0].attachEvent('on' + a[1], a[2]):
				false;
	},
	// Suppression d'un gestionnaire d'evenement sur un element pour un evenement donne
	remove: function(oElem, sEvType, fn, bCapture) {
		return document.addEventListener ?
			oElem.removeEventListener(sEvType, fn, bCapture || false):
			oElem.detachEvent ?
				oElem.detachEvent('on' + sEvType, fn):
				false;
	},
	// Annulation de la propagation d'un evenement et de l'action par defaut d'un element
	stop: function(e) {
		if(e && e.stopPropagation && e.preventDefault) {
			e.stopPropagation();
			e.preventDefault();
		}
		else if(e && window.event) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		return false; // Indispensable pour Safari
	},
	// retourne la position de l'evenement
	getPos: function(e) {
		return window.attachEvent ?
			{'x': event.x, 'y': event.y}:
			{'x': e.pageX, 'y': e.pageY};
	},
	// Retourne la source de l'evenement
	getSrc: function(e) {
		return e.target || e.srcElement;
	},
	relSrc: function(e) {
		switch(e.type) {
			case 'mouseover': // Retourne l'element survole precedent l'element source de l'evenement
				return e.relatedTarget || e.fromElement;
			case 'mouseout': // Retourne l'element survole suivant l'element source de l'evenement
				return e.relatedTarget || e.toElement;
		}
	},
	// Detecte le chargement du DOM -  http://dean.edwards.name/weblog/2006/06/again/#comment5338
 
	domready: function(fn) {
		// Internet Explorer 
		if(window.attachEvent) {
			document.write('<script id="ieScriptLoad" defer src="//:"><\/script>');
			document.getElementById('ieScriptLoad').onreadystatechange = function() {
				if(this.readyState == 'complete')
					$e.init(fn);
			};
		}
		// Mozilla/Opera 9 
		if(document.addEventListener)
			document.addEventListener('DOMContentLoaded', function() { $e.init(fn); }, false);
		// Safari 
		if(navigator.userAgent.search(/WebKit/i) != -1){
		    $e.loadTimer = setInterval(function (){
				if(document.readyState.search(/loaded|complete/i) != -1)
					$e.init(fn);
			}, 10);
		}
		// Other web browsers
		if($e)
			$e.add(window, 'load', function() { $e.init(fn); });
	},
	// Initialise le script
	init: function(fn) {
		if (arguments.callee.done) return;
		arguments.callee.done = true;
		if ($e.loadTimer) clearInterval($e.loadTimer);
			fn();
	}
};

/** *********************************************************************************************************
    AJAX
    EXEMPLES :
	$a.getXHR({method: 'get', url: 'index.php', callback: function() {
		document.body.innerHTML += oResponse.text;
	}});
	$a.getXHR({method: 'post', url: 'index.php', param: 'ajax=true', callback: function() {
		document.body.innerHTML += oResponse.text;
	}});
*/

var $a = {
	// Temps accepte pour une requete
	tempoXHR: 2500,
	// Support de l'objet XMLHttpRequest
	bXHRSupport: (typeof XMLHttpRequest != "undefined"),
	// Support de l'objet ActiveXObject
	bActiveXSupport: (window.ActiveXObject),
	// Version de l'ActiveX
	aMSXML: ["Microsoft.XMLHTTP",
		"MSXML2.XMLHTTP", "MSXML2.XMLHTTP.3.0",
		"MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.5.0",
		"MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.7.0"],
	// Creation de l'objet XHR
	createXHR: function() {
		if($a.bXHRSupport)
			return new XMLHttpRequest;
		else if($a.bActiveXSupport) {
			var iI;
			iI = $a.aMSXML.length;
			do {
				try {
					return new ActiveXObject($a.aMSXML[--iI]);
				}
				catch(oError) { };
			}
			while(iI > 0);
			throw new Error("L'objet oXHR n'a pas été créé");
		}
	},
	// Lancement de la requete Ajax
	getXHR: function(oReq) {
		var oXHR = $a.createXHR();
		$a.oReq = oReq;
		oXHR.open($a.oReq['method'], $a.oReq['url'], $a.oReq['sync'] && $a.oReq['sync'] == 'true' ? false : true);
		var oTimer = setTimeout(
			function() {
				if(oXHR)
					return oXHR.abort();
			},
			$a['tempoXHR']
		);
		oXHR.onreadystatechange = function() {
			if(oXHR.readyState == 4)
				if(oXHR.status && /200|304/.test(oXHR.status)) {
					clearTimeout(oTimer);
					oResponse = {
						text: oXHR.responseText
					};
					if($a.oReq['callback'])
						($a.oReq['callback'])();
				}
		};
		oXHR.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
		if($a.oReq['method'] == 'post')
			oXHR.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		return $a.oReq['method'] == 'get' ? oXHR.send(null) : oXHR.send($a.oReq['param']);
	}
};

k64 = {
	$: $.select,
	addClass: $c.add,
	removeClass: $c.remove,
	swapClass: $c.swap,
	hasClass: $c.has,
	addEvent: $e.add,
	removeEvent: $e.remove,
	stop: $e.stop,
	getPos: $e.getPos,
	getSrc: $e.getSrc,
	relSrc: $e.relSrc,
	getXHR: $a.getXHR
};

})();

/** *********************************************************************************************************
    SCRIPT D'UNE INFOBULLE QUI SUIT LA SOURIS
*/

(function() {

var Infobulle = function() {};

var Ip = Infobulle.prototype = {
	init: function() {
		return k64.addEvent('domready', Ip.load);
	},
	load: function() {
		if(!k64.hasClass(document.documentElement, 'hasJS'))
			k64.addClass(document.documentElement, 'hasJS');
		var oA = k64.$(document, 'a')[0];
		if(!oA) return;
		k64.addEvent(document, 'mousemove', Ip.loadInfo(oA));
		k64.addEvent(oA, 'mouseout', Ip.hideInfo);
		k64.addEvent(oA, 'mouseover', Ip.displayInfo);
	},
	loadInfo: function(oA) {
		if(!k64.$('info'))
			k64.getXHR({
				'method': 'get',
				'url': oA.href + '?ajax=true',
				'callback': function() {
					oA.parentNode.parentNode.innerHTML += oResponse.text;
					if(k64.$('info')) {
						var oInfo = k64.$('info');
						k64.addClass(oInfo, 'hidden');
					}
					return Ip.load();
				}
			});
		return function(e) {
			var oInfo = k64.$('info');
			if(oInfo) {
				var iPos = k64.getPos(e);
				oInfo.style.top = iPos.y + 10 + 'px';
				oInfo.style.left = iPos.x + 15 + 'px';
			}
			return true;
		}
	},
	hideInfo: function() {
		if(k64.$('info'))
			k64.addClass(k64.$('info'), 'hidden');
		return true;
	},
	displayInfo: function() {
		if(k64.$('info'))
			k64.removeClass(k64.$('info'), 'hidden');
		return true;
	}
};

var infobulle = new Infobulle;
infobulle.init();

})();

... ce qui donne ceci.
koala64 a écrit :
....
... ce qui donne ceci.


salut,

ton script est pas mal

par contre comment le faire fonctionner sur une page qui contiendrait plusieurs liens ???

Merci.
Bonjour! Je sais que ce post est mort depuis longtemps, mais j'ai récemment un peu "upgradé" le code de koala64 afin de pouvoir afficher plusieurs éléments. Voici mes modifications:

Aux environs de la ligne 20, remplacer le code:


if(aArgs.length > 1 && typeof aArgs[1] == 'string') 
{
return typeof aArgs[0] == 'string' ?
document.getElementById(aArgs[0]).getElementsByTagName(aArgs[1]):aArgs[0].getElementsByTagName(aArgs[1]);		
}


par:

if(aArgs.length > 1 && typeof aArgs[1] == 'string') 
{
return typeof aArgs[0] == 'string' ?
//Modifié par Sébastien Lavoie--> Au lieu de chercher le tag de la balise, il cherche maintenant le nom de classe!

document.getElementById(aArgs[0]).getElementsByClassName(aArgs[1]):aArgs[0].getElementsByClassName(aArgs[1]);
}


Maintenant, au lieu de chercher juste les balises "a", il va chercher les éléments d'une même classe que vous pourrez mentionner aux environs de la ligne 275. D'ailleurs, c'est la 2e modification:

Code avant modification:

var oA =k64.$(document, 'a')[1];

if(!oA) return;
k64.addEvent(document, 'mousemove', Ip.loadInfo(oA));
k64.addEvent(oA, 'mouseout', Ip.hideInfo);
k64.addEvent(oA, 'mouseover', Ip.displayInfo);


Code après modification:

var oA =null;
		for(cpt=0;cpt<k64.$(document, 'afficheur').length;cpt++)
		{
			oA =k64.$(document, 'afficheur')[cpt];

			if(!oA) return;
			k64.addEvent(document, 'mousemove', Ip.loadInfo(oA));
			k64.addEvent(oA, 'mouseout', Ip.hideInfo);
			k64.addEvent(oA, 'mouseover', Ip.displayInfo);
		}


Maintenant, au lieu de seulement appliquer l'aperçu à un élément de la page, il va le faire pour chaque élément portant le nom de la classe que vous aurez choisi. En espérant que ça aidera quelqu'un dans le besoin!