11548 sujets

JavaScript, DOM et API Web HTML5

Bonsoir,

J'ai le code suivant

<ul>
<li><a href="#bgpopup">n°1</a></li>
<li><a href="#bgpopup">n°2</a></li>
<li><a href="#bgpopup">n°3</a></li>
</ul>

<div id="bgpopup">
<p>"test"</p>
</div>


Lorsque je clique sur un des liens de la liste cela m'ouvre une popup à l'aide d'une fonction javascript.

J'aimerais selon le lien que je clique sur la liste cela m'affiche dans ma popup par exemple
test1 si je clique sur le premier lien, test2 si c'est le second etc...

Avez vous une idée svp?
Modifié par ashesheart (16 Jun 2007 - 20:58)
Salut Smiley cligne ,

il faudrait voir le code d'appel de la popup mais une méthode simple pourrait être de passer la variable en get. Quelque chose comme :
<ul>
<li><a href="?valeur=1#bgpopup">n°1</a></li>
<li><a href="?valeur=2#bgpopup">n°2</a></li>
<li><a href="?valeur=3#bgpopup">n°3</a></li>
</ul>
Ta solution ne fonctionne pas. Voici le code de la fonction popup.
function pop()
{
    var myAs = document.getElementsByTagName('a');
    for (var a = 0; a < myAs.length; ++a) {
		//If the link have a class 'pop'.
        if (myAs[a].className == 'pop') {
			//Get the Id with the href
            var pop = document.getElementById(myAs[a].href.substring(myAs[a].href.lastIndexOf('#') + 1));
			//If the popup exist, we display it.
            if (pop) {       
                pop.style.display = 'none';
                myAs[a].onclick = function(){
                    thisPopup = document.getElementById(this.href.substring(this.href.lastIndexOf('#') + 1))
                    thisPopup.style.display = (thisPopup.style.display == 'none') ? 'block' : 'none';
                    return false;
                };
            }
        }
    }
}


au passage j'ai oublié de mettre des class="pop" dans les liens href

Edit: Ta solution aurait pu etre bonne le probleme est que l'url ne change pas quand je clique sur le lien href. Elle n'affiche pas ?valeur=1
Modifié par ashesheart (16 Jun 2007 - 21:19)
Re'

Effectivement ça ne peut pas marcher avec cette fonction... D'autant que ce n'est pas une vraie popup mais un div qui est en display:none jusqu'au clic sur un des liens.

Vu mes faibles connaissances en DOM je vais laisser à quelqu'un d'autre le soin de te répondre Smiley lol

A+
En fait si je reprend mon exemple, si je pouvais simplement changer la valeur de ma variable dans l'attribut onclick du lien a href sa serait gagner.
Par exemple.



<?php 
$valeurtest=0
?>
<ul>
<li><a href="#bgpopup">n°1</a></li>
<li><a href="#bgpopup">n°2</a></li>
<li><a href="#bgpopup">n°3</a></li>
</ul>

<div id="bgpopup">
<p>"test"</p>
</div>


Ensuite dans l'élément onclick de chaque lien href je change la variable valeurtest.

Quelqu'un croit que c'est possible ?
Bonjour,
ça marche plutôt comme ça cette pseudo popup :

<ul>
<li><a href="#bgpopup1" class="pop" >n°1</a></li>
<li><a href="#bgpopup2" class="pop" >n°2</a></li>
<li><a href="#bgpopup3" class="pop" >n°3</a></li>
</ul>

<div id="bgpopup1">
<p>"test1" et contenu que tu veux</p>
</div>
<div id="bgpopup2">
<p>"test2"</p>
</div>
<div id="bgpopup3">
<p>"test3"</p>
</div>

ce sont des divs ou autres éléments présents en bas de page et cachés si javascript est activé pour être affichés lors du click ou action clavier sur le lien correspondant.
Modifié par chmel (17 Jun 2007 - 03:17)
Oui j'avais pensé à cette solution qui marche tout a fait bien. Le probleme est que mes liens proviennent d'une base de données donc il peuvent atteindre le nom de 150 facile donc 150 div caché sa agrandira forcément la taille de la page. En dernie recours j'utiliserais cette solution.

C'est pour cela que j'ai soumis ce probleme ici.
Modérateur
Salut,

A vrai dire, ce n'est pas génial de planquer le contenu ainsi, tu t'en doutes bien. Smiley cligne

Tu peux gérer l'affichage via php uniquement ou alors, si vraiment tu veux te prendre le chou, tu peux associer en surplus quelques touches d'Ajax.

Je te laisse un "petit" exemple que tu peux potasser et adapter à tes besoins... (je ne renvoie pas les données à partir d'une bdd mais ça tu peux le faire en modifiant la fonction getTexte Smiley smile ) :

index.php
<?php

header('Content-type: text/html; charset=utf-8');
ob_start('ob_gzhandler');

function getTexte($num)
{
	switch($num)
	{
		case '1':
			echo 'test n°1';
			break;
		case '2':
			echo 'test n°2';
			break;
		case '3':
			echo 'test n°3';
			break;
		case '4':
			echo 'test n°4';
			break;
		case '5':
			echo 'test n°5';
			break;
		default:
			echo 'erreur';
	}
	return true;
}

if(!empty($_GET['ajaxlink']))
	getTexte(htmlspecialchars($_GET['ajaxlink']));
else
{
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.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>Exemple Ajax</title>
		<style type="text/css"><!--

@media screen, projection {
	p
	{
		background-color: #58F;
		width: 200px;
		padding: 10px;
		border: 2px solid #2C5;
	}
}

		--></style>
		<script type="text/javascript" src="ajax.js"></script>
	</head>

	<body>

<ul class="test">
	<li><a href="index.php?link=1">lien n°1</a></li>
	<li><a href="index.php?link=2">lien n°2</a></li>
	<li><a href="index.php?link=3">lien n°3</a></li>
	<li><a href="index.php?link=4">lien n°4</a></li>
	<li><a href="index.php?link=5">lien n°5</a></li>
</ul>

<?php
	if(!empty($_GET['link']))
	{
		echo '<p>';
		getTexte(htmlspecialchars($_GET['link']));
		echo '</p>';
	}
?>
	</body>
</html>
<?php
}
?>


ajax.js
(function() {

var oO =
{
	bXHRSupport: (typeof XMLHttpRequest != "undefined"),

	bActiveXSupport: (window.ActiveXObject),

	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"],

	oCreateXHR: function()
	{
		if(oO.bXHRSupport)
			return new XMLHttpRequest;
		else if(oO.bActiveXSupport)
		{
			var iI = oO.aMSXML.length - 1;

			for(; iI >= 0; iI--)
			{
				try
				{
					return new ActiveXObject(oO.aMSXML[iI]);
				}
				catch(oError) { }
			}
			throw new Error("L'objet XHR n'a pas été créé.");
		}
	},

	fnGetXHR: function(sUrl)
	{
		var oXHR = oO.oCreateXHR();

		oXHR.open('get', sUrl, true);
		oXHR.onreadystatechange = function()
		{
			if(oXHR.readyState === 4)
				if(oXHR.status && /200|304/.test(oXHR.status))
					return oO.oSetData(oXHR.responseText);
		}
		oXHR.send(null);

		return false;
	},

	oSetData: function(sData)
	{
		if(oO.oId('result'))
			return oO.oId('result').innerHTML = sData;
		else
		{
			var oResult = document.createElement('p');
			oResult.id = 'result';
			document.body.appendChild(oResult);
			return oO.oId('result').innerHTML = sData;
		}
	},

	fnConnect: function(oElem, sEvType, fn, bCapture)
	{
		return document.addEventListener ?
			oElem.addEventListener(sEvType, fn, bCapture):
			oElem.attachEvent ?
				oElem.attachEvent('on' + sEvType, fn):
				false;
	},

	oId: function(sId)
	{
		if(document.getElementById(sId))
			return document.getElementById(sId);

		return false;
	},

	aTag: function(oEl, sTag)
	{
		if(oEl && sTag && oEl.getElementsByTagName(sTag))
			return oEl.getElementsByTagName(sTag);

		return false;
	},

	bCancelClick: 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;
	},

	oGetSource: function(e)
	{
		return e.target || e.srcElement;
	},

	fnPrepaRequest: function(e)
	{
		var oSource = oO.oGetSource(e),
		    sParam = oSource.href.substring(oSource.href.lastIndexOf('=') + 1),
		    sUrl = 'index.php?ajaxlink=';
		
		sUrl += encodeURIComponent(sParam);

		return oO.fnGetXHR(sUrl);
	},

	oInit: function()
	{
		var oBody = document.body,
		    aUls = oO.aTag(oBody, 'ul'),
		    iI = aUls.length;
		
		while(iI > 0)
			if(aUls[--iI].className === 'test')
			{
				var aAs = oO.aTag(aUls[iI], 'a'),
				    iJ = aAs.length;
				
				do
					oO.fnConnect(
						aAs[--iJ],
						'click',
						function(e)
						{
							oO.fnPrepaRequest(e);
							return oO.bCancelClick(e);
						},
						false
					);
				while(iJ > 0);
			}
	}
};

oO.fnConnect(window, 'load', oO.oInit, false);

})();
... ce qui donne ceci.

Dans le cas présent, si tu conserves la partie Ajax, il faut rétablir l'historique et la possibilité de bookmarker. Tu peux le faire via une librairie par exemple (Je te le conseille d'ailleurs parce que ce n'est vraiment pas simple à coder Smiley cligne )
Merci pour ton aide Koala64. dans une autre optique j'avais pensé a utiliser la librairie prototype. Puis par la suite utiliser la fonction Ajax.Updater (qui met a jour un élément de la page) mais je n'arrive pas a m'en servir
Modérateur
Salut,

ashesheart a écrit :
dans une autre optique j'avais pensé a utiliser la librairie prototype.
Tout dépend de ce que tu comptes faire avec et ce pourquoi le site est destiné. Personnellement, je n'envisage prototype que pour un intranet, là où je serais sûr que tout le monde dispose du haut débit parce que c'est super lourd. Par ailleurs, en terme de maintenance, cette bibliothèque est une horreur -> Le code est imbitable et au moindre problème, on se retrouve vite dans les choux.

Si malgré tout tu y tiens, j'avais fait un petit exemple ici :

http://forum.alsacreations.com/topic-24-25586-1-Probleme--Prototypejs--ajaxupdater-amp-IE.html#p193884

Si vraiment tu veux être en mesure de contrôler les moindres recoins de ton code, programme le toi-même. Smiley cligne
A l'inverse, si tu veux aller vite, je te conseillerais plutôt de prendre une bibliothèque plus légère telle que mootools...
Merci pour ton aide. Tu as tapé dans le mille, ce programme est un intranet et sera destiné a la vente. Merci pour ton exemple. Je ne maitrise vraiment pas encore tout ce qui est ajax, javascript et tout le reste mais je m'y met doucement. Néanmoins ta suggestion d'utiliser mootools (si la librairie est moins lourde ) est une bonne idée et si t'as un exemple avec cette librairie ce serait la bienvenue.

En tout cas merci pour ton aide.
Modifié par ashesheart (19 Jun 2007 - 09:15)