IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques & Frameworks Discussion :

Sortable Scriptaculous-Prototype et Firefox 3 [script.aculo.us]


Sujet :

Bibliothèques & Frameworks

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 164
    Points : 303
    Points
    303
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    sections.each is not a function
    Je pense que l'erreur vient de la première ligne de la fonction getGroupOrder() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var sections = document.getElementsByClassName(className);

    Comment contourner cette erreur?

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Comment contourner cette erreur?
    En ne faisant pas d'erreur dans le code ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var sections = document.getElementsByClassName(className);
    ne te renvoie pas d'éléments étendus donc non utilisables par Prototype.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var sections = $$(className);
    risque de beaucoup mieux fonctionner.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 164
    Points : 303
    Points
    303
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 164
    Points : 303
    Points
    303
    Par défaut
    Oui, j'ai essayé en leur passant une classe "test". Ca ne fonctionne pas.

    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?

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Oui, pour utiliser each, il faut des éléments 'étendus' dans Prototype, or
    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

  7. #7
    Membre expérimenté Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Points : 1 388
    Points
    1 388
    Par défaut
    Citation Envoyé par Bovino Voir le message
    En ne faisant pas d'erreur dans le code ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var sections = document.getElementsByClassName(className);
    ne te renvoie pas d'éléments étendus donc non utilisables par Prototype.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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").

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 164
    Points : 303
    Points
    303
    Par défaut
    Ca fonctionne!

    en utilisant
    Testé sous FF2 FF3 et IE7


    Merci mille fois à tous les 2!

  9. #9
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Bon, c'est pas pour me chercher des excuses faciles, mais
    var sections = document.getElementsByClassName(className);
    c'est un copier/coller mais j'avais cru lire :
    var sections = document.getElementsByTagName(className);
    et
    $$('.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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] [Scriptaculous] Xajax et Firefox 3
    Par trashyquaker dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/09/2008, 15h10
  2. [script.aculo.us] Lightbox compatible avec Prototype
    Par messier79 dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 09/09/2008, 14h43
  3. [script.aculo.us] Drag&Drop / Sortable / Scriptaculous
    Par thibane dans le forum Bibliothèques & Frameworks
    Réponses: 9
    Dernier message: 27/06/2008, 23h10
  4. [script.aculo.us] [Prototype] Sauver/Charger la position d'un panel "drag and dropable"
    Par coboy dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 23/06/2008, 11h22
  5. [script.aculo.us] Autocompletion avec DWR
    Par Kelem dans le forum Bibliothèques & Frameworks
    Réponses: 4
    Dernier message: 28/06/2006, 09h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo