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 :

Simuler l'appui d'un bouton pour exécuter une commande d'export de données


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Utilisateur occasionnel de MySQL
    Inscrit en
    Décembre 2017
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Utilisateur occasionnel de MySQL

    Informations forums :
    Inscription : Décembre 2017
    Messages : 49
    Points : 38
    Points
    38
    Par défaut Simuler l'appui d'un bouton pour exécuter une commande d'export de données
    Bonjour,


    Je suis en train de modifier une page html qui me permet d'afficher des cartes avec l'API Leaflet.

    Dans cette page je peux exporter les données geojson d'une couche en cliquant sur un bouton dirigeant vers un lien dans la page dont voici le code :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="#" id='exportgpx' data-toggle="tooltip" title="Enregistrer les waypoints et/ou tracés au format gpx">Gpx</a>

    Coté javacript, ce lien aboutit à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    document.getElementById('exportgpx').onclick = function(e) {
                // Extract GeoJson from featureGroup
                var data = exportlayers.toGeoJSON();
                var gpx = togpx(data);
                // Stringify the GeoJson
                var convertedData = 'text/gpx;charset=utf-8,' + encodeURIComponent(gpx);
                // Create export
                var name = prompt('Enter file name','data'); // second param can be empty, it is the default value
                document.getElementById('exportgpx').setAttribute('href', 'data:' + convertedData);
                document.getElementById('exportgpx').setAttribute('download',name + '.gpx');
        }
    Les exports de données sont fonctionnels.

    Maintenant je désire enchaîner deux commandes, d'une part une sélection de couches à exporter avec une checkbox à choix multiples, puis une fois les choix réalisés, les valider pour export dans une couche et poursuivre par l'export vers le fichier gpx sans cliquer sur le bouton "exportgpx" sur la page, mais en simulant son appui. J'ai utilisé ce code :

    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
    function valid(){
     
    var exportlayers = L.featureGroup();
     
    var checkboxes1 = document.getElementById("lieux1");
    if (checkboxes1.checked){
    layerGroup001.addTo(exportlayers);}
    var checkboxes2 = document.getElementById("lieux2");
    if (checkboxes2.checked){
    layerGroup002.addTo(exportlayers);}
    var checkboxes3 = document.getElementById("lieux3");
    if (checkboxes3.checked){
    layerGroup003.addTo(exportlayers);}
     
    const evt = new MouseEvent("click", {
      view: window,
      bubbles: true,
    );
    document.getElementById('exportgpx').dispatchEvent(evt);
     
    document.getElementById('exportgpx').onclick = function(e) {
                var data = exportlayers.toGeoJSON();
                var gpx = togpx(data);
                var convertedData = 'text/gpx;charset=utf-8,' + encodeURIComponent(gpx);
                var name = prompt('Enter file name','data'); // second param can be empty, it is the default value
                document.getElementById('exportgpx').setAttribute('href', 'data:' + convertedData);
                document.getElementById('exportgpx').setAttribute('download',name + '.gpx');
        }
    }
    Je constate que l'export ne se fait pas à la première validation, mais en renouvelant cette validation. Je pense que la simulation d'appui doit être en cause, mais je ne sais comment y remédier.

    Je vous remercie de votre aide

    Bernard

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    pas tout bien compris mais est-cce qu'un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementById('exportgpx').click();
    ne suffirait pas ?

    Nota : pourquoi mettre un élément <a> alors que sémantiquement ce rôle revient à un <button> pouvant très largement être stylé en CSS ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Utilisateur occasionnel de MySQL
    Inscrit en
    Décembre 2017
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Utilisateur occasionnel de MySQL

    Informations forums :
    Inscription : Décembre 2017
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    Bonjour NoSmoking,


    Pour développer ma page Leaflet je me suis inspiré de ce code : https://gist.github.com/danswick/d30c44b081be31aea483

    Je viens de remplacer la simulation de cet export par : document.getElementById('exportgpx').click();.

    Le comportement est identique, je dois toujours cliquer deux fois pour que cet export se lance

    J'ai répété deux fois

    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
    document.getElementById('exportgpx').click();
     
    document.getElementById('exportgpx').onclick = function(e) {
                // Extract GeoJson from featureGroup
                var data = exportlayers.toGeoJSON();
     
                var gpx = togpx(data);
                // Stringify the GeoJson
     
    			var convertedData = 'text/gpx;charset=utf-8,' + encodeURIComponent(gpx);
                // Create export
    			var name = prompt('Enter file name','data'); // second param can be empty, it is the default value
                document.getElementById('exportgpx').setAttribute('href', 'data:' + convertedData);
                document.getElementById('exportgpx').setAttribute('download',name + '.gpx');
        }
    Ça génère le fichier, il semblerait que ce lien dans le bouton soit différent d'un simple click ?

    Bernard

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Attention :
    il faut que la fonction à executer sur le clic soit affectée avant de cliquer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const oBtn = document.getElementById("exportgpx");
    // on défini ce que l'on veut faire au clic
    oBtn.addEventListener("click", function(e) {
      // action au click
    });
    // maintenant on peut simuler le clic !
    oBtn.click();

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Utilisateur occasionnel de MySQL
    Inscrit en
    Décembre 2017
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Utilisateur occasionnel de MySQL

    Informations forums :
    Inscription : Décembre 2017
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    Je viens de tester cette simulation de click :
    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
    const oBtn = document.getElementById("exportgpx");
    // on défini ce que l'on veut faire au clic
    oBtn.addEventListener("click", function(e) {
    document.getElementById('exportgpx').click();
    });
    // maintenant on peut simuler le clic !
    oBtn.click();
     
     document.getElementById('exportgpx').onclick = function(e) {
                // Extract GeoJson from featureGroup
                var data = exportlayers.toGeoJSON();
     
                var gpx = togpx(data);
                // Stringify the GeoJson
     
    			var convertedData = 'text/gpx;charset=utf-8,' + encodeURIComponent(gpx);
                // Create export
    			var name = prompt('Enter file name','data'); // second param can be empty, it is the default value
                document.getElementById('exportgpx').setAttribute('href', 'data:' + convertedData);
                document.getElementById('exportgpx').setAttribute('download',name + '.gpx');
     
    }
    Il me faut toujours valider deux fois pour obtenir cet export, ai-je bien pris en compte le code ?

    Bernard

  6. #6
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Premier point, contrairement à ce que je t'ai dis plus haut, et après avoir regardé ton lien, il s’avère qu'il te faut bien utiliser un élément <a> car tu l'utilises pour le download.

    Ceci étant réatbli :
    Il me faut toujours valider deux fois pour obtenir cet export, ai-je bien pris en compte le code ?
    Ta correction est erronée car visiblement tu n'a pas saisie ce que tu faisais, donc on reprend.
    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
    // récup. de l'objetHTML de ton lien
    const elemExport = document.getElementById("exportgpx");
     
    // affectation de ce que l'on veut faire au clic
    elemExport.addEventListener("click", function() {
      // Extract GeoJson from featureGroup
      const data = featureGroup.toGeoJSON();
     
      // Stringify the GeoJson
      const convertedData = 'text/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(data));
     
      // Create export
      elemExport.setAttribute('href', 'data:' + convertedData);
      elemExport.setAttribute('download', 'data.geojson');
    });
     
    // si on veut simuler le clic
    elemExport.click();
    Pas plus de code à mettre et celui-ci remplace le tien.

    C'est maintenant que je ne comprends pas pourquoi tu veux simuler le clic !?!

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Utilisateur occasionnel de MySQL
    Inscrit en
    Décembre 2017
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Utilisateur occasionnel de MySQL

    Informations forums :
    Inscription : Décembre 2017
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    Bonsoir NoSmokung,

    Je viens d'appliquer les lignes de code après la création de la couche, en validant rien ne se produit. Sinon s'il est possible de se passer de ce "click" ou appel à la simulation de ce bouton, je suis preneur.

    Avec mes remerciements pour ton aide

    Bernard

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Je viens d'appliquer les lignes de code après la création de la couche,
    il doit y avoir quelque chose qui m'échappe, aucune raison que cela ne fonctionne pas !

    Montre nous ton script pour que l'on voit où, quand et comment, est définie, où, quand et comment, est appelée l'action d'exportation.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Utilisateur occasionnel de MySQL
    Inscrit en
    Décembre 2017
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Utilisateur occasionnel de MySQL

    Informations forums :
    Inscription : Décembre 2017
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    Bonsoir NoSmoking,

    Cet après-midi j'ai élaboré une carte de test en nettoyant le code initial de fonctions qui n'interagissent pas avec ma recherche d'export. A la fin j'ai recollé les lignes que tu m'as proposées et me suis aperçu que la référence à la couche était à modifier en remplaçant "featureGroup" par "exportlayers", et l'export a fonctionné.

    Comme j'ai dérouté un bouton existant d'export vers gpx, j'en ai créé un autre appelé "exportgpx-2", j'ai du déclarer ce bouton dans body et dans le script en ajoutant :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementById('exportgpx-2').onclick = function(e) {}

    Afin que tu te rendes compte de ma recherche, voici le lien vers la carte de test sur mon espace perso de Free : http://manardb.free.fr/tmp/Carte-test.html

    Lors du chargement de la page il y a trois fichiers de données d'un total d'environ 18 Mo qui se chargent. Ce sont ceux des noms de localités, lieux d'habitat et relief (hypsographie) du Maroc.

    Dans le champ après "Texte recherché" je saisis une suite de caractères en minuscules (les données dans les fichiers ont toutes été converties en minuscules). Ensuite il faut cliquer sur "Rafraîchir" pour lancer la requête dans les fichiers, la saisie des caractères se stocke dans localStorage. On peut visualiser le résultat de cette recherche sur la carte depuis le bouton contrôle des couches. Depuis le menu déroulant, objet de mon post, on peut exporter le résultat de la requête par items ou lot au format gpx.

    Je renouvelle mes remerciements pour ton aide précieuse

    Bonne soirée

    Bernard

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/04/2017, 12h01
  2. [AC-2007] Bouton pour exécuter une tache d' exportation
    Par stephi222 dans le forum VBA Access
    Réponses: 2
    Dernier message: 31/07/2014, 08h06
  3. Réponses: 9
    Dernier message: 29/06/2010, 16h44
  4. Un bouton pour exécuter une fonction
    Par floctc dans le forum Langage
    Réponses: 5
    Dernier message: 05/05/2009, 11h18
  5. Fichier BATCH pour exécuter une commande (Wake on LAN)
    Par snoopy69 dans le forum Windows XP
    Réponses: 0
    Dernier message: 23/04/2008, 07h14

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