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

JavaScript Discussion :

Boucle for each pour récupérer des éléments de deux tag différents


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut Boucle for each pour récupérer des éléments de deux tag différents
    Bonjour a tous
    j'ai remis mon drag and drop and attach parent dans mon nouveau wysiwyg
    les evenement sont dynamiques(addEventlisterner)
    ca marche tres bien
    par contre des que j'enregistre mon document( la partie editeur) et qu'eventuellement je la reload pour la modifier je n'ai plis les evenement forcement
    je voudrais donc une sorte de boucle (for each; je sais qu'elle va etre retirer donc je ne veux pas l'utiliser)
    qui me boucle sur tout les element et aux element image et div ayant respectivement la classe "divint" et "image" ajouter l'evenement dragstart
    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
    function ouvrirfichier() {
                    choixfichier.click();
                    var chemin = choixfichier.value;
                    obj = new ActiveXObject("Microsoft.XMLHTTP");
                    obj.open("GET", chemin, false);
                    obj.send(null);
                    if (obj.readyState == 4) {
                            var txt = obj.responseText.split("<cdd>")[1];
                            txt = txt.split("<PRE>")[0];
                            editeur.innerHTML = txt;
                    }
     
                //ajouter l'evenement a tout les element ayant la classe "divint" ou "image" ((.addEventListener("dragstart", dragstart, false)));
     
    }
    merci pour les retours
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re en attendant vos solutions j'ai fait a l'ancienne
    en attendant je fait comme ca est ce que c'est perenne
    Code javascript : 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
    function ouvrirfichier() {
            choixfichier.click();
            var chemin = choixfichier.value;
            obj = new ActiveXObject("Microsoft.XMLHTTP");
            obj.open("GET", chemin, false);
            obj.send(null);
            if (obj.readyState == 4) {
                    var txt = obj.responseText.split("<cdd>")[1];
                    txt = txt.split("<PRE>")[0];
                    editeur.innerHTML = txt;
            }
            var elements = editeur.getElementsByTagName("*");
            for (var i = 0; i < elements.length; i++) {
                    if (elements[i].className === "divint" || elements[i].className === "image") {
                            elements[i].addEventListener("dragstart", dragstart, false);
                    }
            }
    }
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Je réagis là-dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var elements = editeur.getElementsByTagName("*");
    for (var i = 0; i < elements.length; i++) {
      if (...) {
        elements[i].addEventListener("dragstart", dragstart, false);
      }
    }
    S’il y a des éléments imbriqués dans ton éditeur (et d’après ce que j’ai compris, c’est fortement probable), tu vas avoir des scénarios dans lesquels un élément, et son parent, et son grand-parent, etc., ont chacun un gestionnaire de dragstart, de quoi créer une situation vraiment chaotique.

    En plus de ça tu as un problème de performances en deux points :
    • getElementsByTagName qui est notoirement lente quand on lui passe "*"
    • le fait d’ajouter un grand nombre de gestionnaires d’évènements dans la page.


    La solution, c’est de faire de la délégation d’évènement, c’est-à-dire d’avoir un seul gestionnaire d’évènement attaché à la zone contenteditable entière, et d’examiner event.target pour déterminer quel élément est la véritable cible de l’évènement.

    Ça a aussi l’avantage de gérer automatiquement les éléments nouvellement ajoutés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // en supposant que tu as une variable zone
    zone.addEventListener("dragstart", function (event) {
      if (event.target.className === "divint" || event.target.className === "image") {
        // ...
        // (le code de la fonction dragstart)
        // ...
      }
    });
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    oui mais il n'y a pas une gestion de eventpreventdefaut() a faire ?
    c'est une torture pour moi dans l'ancien qui a été fait comme ca
    et il y a pas mal de ratés au point des fois de fermer le fichier car aucun retour possible

    c'est pour ca que je l'ai fait plus clair
    et puis j'apprends en meme temps

    je suis justement en train de revoir mon drag/attach new parent qui utilise l'evenement document move,down,up pour les deplacement
    je l'avais fait comme ca parceque dans un content editable dans IE 10 utiliser les evenement des elements eux memes etait pas possible je viens de constater q'uavec IE 11 ca fonctionne meme si le parent est contentedtable
    apres il faut pas oublier que mon support 1(ocx webbrowser vbaexcel est capricieux ) je jongle donc entre ce comment on doit faire et ce qui est possible
    pour le moment mon fichier marche dans IE,ocx webbrowser,chrome(sauf imageinsert
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    en attendant je fait comme ca est ce que c'est perenne
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
            var elements = editeur.getElementsByTagName("*");
            for (var i = 0; i < elements.length; i++) {
                    if (elements[i].className === "divint" || elements[i].className === "image") {
                            elements[i].addEventListener("dragstart", dragstart, false);
                    }
            }
    Je pense que ce serait plus rapide avec : var elements = document.querySelectorAll(".divint,.image ")!; car tu récupères seulement les éléments qui t'intéressent et donc moins d’éléments à traiter et plus besoin du if...

    Sinon tu fais ça pour pouvoir déplacer les images par glisser/déposer ? Sur FF et Chrome on peut déjà (nativement) déplacer une image par glisser/déposer et sur FF on peut même la redimensionner... Mais c'est vrai que sur Chrome c'est moins intuitif et il n'y a pas le redimensionnement...

    Citation Envoyé par Watilin Voir le message
    La solution, c’est de faire de la délégation d’évènement, c’est-à-dire d’avoir un seul gestionnaire d’évènement attaché à la zone contenteditable entière, et d’examiner event.target pour déterminer quel élément est la véritable cible de l’évènement.

    Ça a aussi l’avantage de gérer automatiquement les éléments nouvellement ajoutés.
    Intéressant, au message #2 (dernier paragraphe) je proposais un truc de ce genre pour les boutons...

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour tout les deux je vais essayer queryselector si c'est compatible avec mon support si oui ca change la vie

    et oui je fait ca non seulement pour deplacer les div mais je change le parent il y a une partie attache au new parent avec

    c'est pas natif dans IE il y a juste le drag an drop mais pas le deplacement dans un meme parent et le redim est que en content editable

    bon si vous y tenez je vais reprendre a zero en gradant les fonctions qui sont pretes et fonctionnel on va passer en mode event et event.target
    ca m'epuise ce language

    pour le deplacement et attach voir demo ci dessous je sais pas si le gif va passer 1Mega80
    Nom : demo2.gif
Affichages : 228
Taille : 1,82 Mo
    ca c'est pas natif
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Ah oui c'est une bonne fonctionnalité ça... Je vois qu'il y a les fameux rectangles autour de l'image/de la div comme sur FF mais sur Chrome il n'y en a pas du coup c'est moins intuitif... Je me demande si ça vaut le coup et si ce n'est pas trop difficile de l'ajouter...

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/01/2018, 18h14
  2. [BI4] Récupérer des dimensions de deux univers différents
    Par Schamm dans le forum Webi
    Réponses: 4
    Dernier message: 19/07/2016, 16h41
  3. Réponses: 2
    Dernier message: 31/10/2011, 13h48
  4. Récupérer les éléments de deux map différentes en une seule boucle.
    Par floctc dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 19/05/2010, 15h50
  5. Réponses: 4
    Dernier message: 21/02/2010, 12h39

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