Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript > Bibliothèques & Frameworks > Prototype & Script.aculo.us
Prototype & Script.aculo.us Forum d'entraide sur les frameworks Prototype et Script.aculo.us
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/06/2008, 16h33   #1
Membre régulier
 
Inscription : mars 2007
Messages : 115
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : mars 2007
Messages : 115
Points : 97
Points : 97
Par défaut Sortable Scriptaculous-Prototype et Firefox 3

Bonjour à tous!

J'ai un code qui me permet de gérer l'ordre d'une liste d'éléments en Drag & Drop.

A chaque fois qu'on déplace un élément j'appelle la fonction getGroupOrder() qui inscrit l'ordre dans un champs caché pour chaque élément.

Ce code fonctionne très bien sous IE6/7 et FF2 mais PAS sous Firefox3.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!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" lang="fr" xml:lang="fr">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta http-equiv="content-language" content="fr" />
 
 
	<script type="text/javascript" src="js/prototype.js"></script>	
	<script type="text/javascript" src="js/scriptaculous.js"></script>
	<script language="JavaScript">
	function getGroupOrder(className, orderIds, nbElements) {
		var sections = document.getElementsByClassName(className);
		var sequence = '';
		sections.each(function(section) {
			var sectionID = section.id;
			var order = Sortable.serialize(sectionID);
			sequence += Sortable.sequence(section);
		});
		imageorder = sequence.split(",");
		for (var i = 0; i < nbElements; i++)
		{
			document.getElementById(orderIds+(imageorder[i])).value = i;
 
			//gestion des numéros d'éléments
			if ( document.getElementById('num_'+(imageorder[i])) )
			{
				document.getElementById('num_'+(imageorder[i])).innerHTML = '<strong>'+(i+1)+'.</strong>';
			}
		}
		return false;
	}
	</script>
Dans ma page, voici les éléments :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
<div id="priority" class="priority">
 
    <li id="box_0">
         <div class="box-order">
	     <table border="0" cellpadding="0" cellspacing="0">
		<tr class="" onmouseup="getGroupOrder('priority', 'orderId_', 45);"></tr>
	     </table>
	     <input type="hidden" name="orderId_0" id="orderId_0" value="" />
	     <input type="hidden" name="maisonId_0" id="maisonId_0" value="71" />
         </div>
    </li>
 
    <li id="box_1">
        <div class="box-order">
	     <table border="0" cellpadding="0" cellspacing="0">
                  <tr class="" onmouseup="getGroupOrder('priority', 'orderId_', 45);"></tr>
	     </table>
	     <input type="hidden" name="orderId_1" id="orderId_1" value="" />
	     <input type="hidden" name="maisonId_1" id="maisonId_1" value="72" />
         </div>
     </li>
 
</div>
Et en-dessous je crée le Sortable :
Code :
1
2
3
4
5
6
<!-- Sortable script -->
<script type="text/javascript" language="javascript">
 
	Sortable.create('priority',{tag:'li', ghosting:false, constraint:false})
 
</script>






La fonction getGroupOrder() est censée écrire l'ordre de l'image dans le champs caché qui lui est assigné.

Voilà l'erreur que j'obtiens sous Firefox 3 :
Code :
sections.each is not a function
Je pense que l'erreur vient de la première ligne de la fonction getGroupOrder() :
Code :
var sections = document.getElementsByClassName(className);

Comment contourner cette erreur?
dolu02 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2008, 16h39   #2
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 828
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 828
Points : 35 998
Points : 35 998
Citation:
Comment contourner cette erreur?
En ne faisant pas d'erreur dans le code ???

Code :
var sections = document.getElementsByClassName(className);
ne te renvoie pas d'éléments étendus donc non utilisables par Prototype.
Code :
var sections = $$(className);
risque de beaucoup mieux fonctionner.
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2008, 17h08   #3
Membre régulier
 
Inscription : mars 2007
Messages : 115
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : mars 2007
Messages : 115
Points : 97
Points : 97
Ca ne fonctionne pas (y compris sous IE).

Il y a une chose que je ne comprends pas : dans sections on lui passe le div qui contient les éléments ou bien la classe qui est attribuée à tous les élements?
Code :
1
2
3
4
5
6
7
 
<div class="sortable" id="sortable">
    <li class="test"></li>
    <li class="test"></li>
    <li class="test"></li> 
    <li class="test"></li>
</div>
Dans les 2 cas quand je fais un alert(sections) c'est vide!


Merci pour ton aide!
dolu02 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2008, 17h35   #4
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 828
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 828
Points : 35 998
Points : 35 998
Code :
Il y a une chose que je ne comprends pas : dans sections on lui passe le div qui contient les éléments ou bien la classe qui est attribuée à tous les élements?
Je suis pas sûr, mais je pense que c'est plutôt la classe attribuée à tous les éléments... ce qui risque de poser problème vu que dans ton code, les li n'ont pas de classe !
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2008, 17h39   #5
Membre régulier
 
Inscription : mars 2007
Messages : 115
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : mars 2007
Messages : 115
Points : 97
Points : 97
Oui, j'ai essayé en leur passant une classe "test". Ca ne fonctionne pas.

Citation:
ne te renvoie pas d'éléments étendus donc non utilisables par Prototype.
Peux-tu développer stp, ça peut m'aider à comprendre le problème.

Si je ne me trompe pas, le problème vient du fait que je n'arrive pas à pointer les éléments correctement?
dolu02 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2008, 17h46   #6
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 828
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 828
Points : 35 998
Points : 35 998
Oui, pour utiliser each, il faut des éléments 'étendus' dans Prototype, or
Citation:
As of Prototype 1.6, document.getElementsByClassName has been deprecated since native implementations return a NodeList rather than an Array.
Il est donc préférable de passer par $$

Quant à sortable (que je n'ai jamais utilisé, je précise), c'est en fait le container qu'il faut passer en premier paramètre, donc tu avais raison
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2008, 17h47   #7
Modérateur
 
Avatar de DoubleU
 
Inscription : janvier 2006
Messages : 1 107
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 1 107
Points : 1 118
Points : 1 118
Citation:
Envoyé par Bovino Voir le message
En ne faisant pas d'erreur dans le code ???

Code :
var sections = document.getElementsByClassName(className);
ne te renvoie pas d'éléments étendus donc non utilisables par Prototype.
Code :
var sections = $$(className);
risque de beaucoup mieux fonctionner.
Hum...

http://www.prototypejs.org/api/utility/getElementsByClassName

Retrieves (and extends) all the elements that have a CSS class name of className.

Ceci étant, la classe est deprecated et il vaut mieux utiliser $$.

Attention, si tu utilises $$ à bien utiliser un selecteur, et pas seulement la classe css. Exemple $$(".test'), et non $$("test").
DoubleU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2008, 18h09   #8
Membre régulier
 
Inscription : mars 2007
Messages : 115
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : mars 2007
Messages : 115
Points : 97
Points : 97
Ca fonctionne!

en utilisant
Testé sous FF2 FF3 et IE7


Merci mille fois à tous les 2!
dolu02 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2008, 18h46   #9
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 828
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 828
Points : 35 998
Points : 35 998
Bon, c'est pas pour me chercher des excuses faciles, mais
Citation:
var sections = document.getElementsByClassName(className);
c'est un copier/coller mais j'avais cru lire :
Citation:
var sections = document.getElementsByTagName(className);
et
Citation:
$$('.test')
j'étais persuadé de l'avoir modifié, mais ça à dû s'évaporer dans les vapeurs de ma gueule de bois...

En conclusion : j'ai bien merdé... mais je l'avais dit dans ma signature !
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h18.


 
 
 
 
Partenaires

Hébergement Web