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

jQuery Discussion :

Communiquer avec son composant [Plugin]


Sujet :

jQuery

  1. #1
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut Communiquer avec son composant
    Bonjour,

    J'ai créé un composant graphique jquery. Je souhaiterai maintenant l'interroger.
    L'idée serait par une fonction javascript faire un appel à une fonction de mon composant.
    J'ai fais un exemple simple http://jsfiddle.net/szy4gj6v/
    Dans mon exemple, je voudrai que la fonction GetInfo me retourne 'blue'.

  2. #2
    Membre chevronné
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Billets dans le blog
    1
    Par défaut
    Pour arriver à ce genre de manipulation il te faudra passer par les classes et l'instanciation. Voici un pattern que j'utilise souvent pour écrire des plugins et qui est directement dérivé de bootstrap:

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    +function ($) {
      'use strict';
     
      var BK = function (element, options) {
        this.options = options;
        this.$element = $(element);
        this.n = this.$element.attr('id');
     
        this.$element.css('background', this.options.bkg);
      }
     
      BK.DEFAULTS = {
        bkg: 'yellow'
      }
     
      BK.prototype.GetInfo = function () {
        return this.options.bkg;
      }
     
      function Plugin(option) {
        return this.each(function () {
          var $this   = $(this);
          var options = $.extend({}, BK.DEFAULTS, option, typeof option == 'object' && option);
     
          $this.data('bk', new BK(this, options));
        });
      }
     
      var old = $.fn.bk
     
      $.fn.bk             = Plugin
      $.fn.bk.Constructor = BK
    }(jQuery);
     
    $('#div').bk({bkg: 'red'});
    $('#div1').bk({bkg: 'blue'});
     
    $('#btnGetSel').click(function () {
       alert($('#div1').data('bk').GetInfo());
    });

    Le principe est d'écrire une classe très classique en JS puis d'utiliser une fonction "plugin" qui va permettre d'encapsuler la classe en jQuery et d'initialiser le tout. Le principe reste simple, le tout est de stocker quelque part l'instanciation de ta classe, personnellement je le stock sur l'élément via data.

  3. #3
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut
    Bonjour

    Merci pour ta réponse
    Voici une autre réponse qu'on m'a donné sur un autre forum
    http://jsfiddle.net/jakecigar/szy4gj6v/2/

  4. #4
    Membre chevronné
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Billets dans le blog
    1
    Par défaut
    C'est pratiquement pareil la seule différence réside dans l'instanciation que j'effectue et qui n'est pas présent dans le deuxième exemple. Il est possible que la solution que l'on t'a proposé peut avoir certaine contrainte sur une utilisation poussé en JS, toutefois et c'est la seule remarque que j'ai à faire sur pour l'exemple proposé: pour un plugin important la lecture, la maintenance et les risques de collisions peuvent également augmenter.

  5. #5
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut
    J'ai bien vu que les 2 solutions sont proches.
    Mais ce n'est pas vraiment ce que je cherche.
    Je veux accéder vraiment à ma div et l'inspecter pour trouver l'info et pas la mettre en data.
    Je vais avoir dans cette div un tableau avec des cases à cocher et je voudrais me retourner un array des case cochées.
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    $(this)[0].style.background
    retourne bien Blue mais je trouve pas top le [0]
    et
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    $(this).attr("style")
    me retourne background:Blue et pas Blue...

    Et suis-je obligé de faire
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
     if (typeof options === "string") { return $(this).data("BK")[options].apply(this, [].splice.call(arguments, 1)); }
    pour appeler la fonction getInfo dans Settings?

  6. #6
    Membre chevronné
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Billets dans le blog
    1
    Par défaut
    Code javascrit : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $(this)[0].style.background
    this.style.background

    c'est la même chose

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $(this).attr("style") // Ok mais...
    $(this).css('background') // Pourquoi pas ça ?

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    if (typeof options === "string") { return $(this).data("BK")[options].apply(this, [].splice.call(arguments, 1)); }

    Ok cette solution est chiante à écrire même si je l'adore , mais pourquoi ne pas utilisé la mienne ?

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    $('#div1').data('bk').GetInfo()

  7. #7
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut
    me répond une erreur this.style n'existe pas et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(this).css('background')
    est vide...

    Pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (typeof options === "string") { return $(this).data("BK")[options].apply(this, [].splice.call(arguments, 1)); }
    est dans la définition du plugin, si je comprend l'idée, c'est d'enregistrer le settings dans le data de ma div? et de pourvoir y accéder après, même avec la fonction accessible de l'extérieur?

  8. #8
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut
    Au final, j'ai mis setting dans data
    et j'utilise la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     $('#' + nameW + 'Datas tr td:first-child').each(function () {
                     if ($(this).find('#chkSel').is(':checked')) { arr.push($(this).closest('tr').attr('id')); };
                });
    ou nameW est le nom de ma div et nameW+ datas = table créé dynamiquement

  9. #9
    Membre chevronné
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pelote2012 Voir le message
    me répond une erreur this.style
    Effectivement si "this" représente un objet jQuery. Cependant je t'assure que ceci fonctionne

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var test = document.getElementById('div1');
    console.log(test.style.background);
    console.log(test.style.backgroundColor);

    Citation Envoyé par Pelote2012 Voir le message
    n'existe pas et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(this).css('background')
    est vide...
    Alors la propriété background n'est pas remplie

    Citation Envoyé par Pelote2012 Voir le message
    Pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (typeof options === "string") { return $(this).data("BK")[options].apply(this, [].splice.call(arguments, 1)); }
    est dans la définition du plugin, si je comprend l'idée, c'est d'enregistrer le settings dans le data de ma div? et de pourvoir y accéder après, même avec la fonction accessible de l'extérieur?
    C'est tout à fait ça, par contre pour ton dernier post je n'ai pas du tout compris ce que tu fais en fait

  10. #10
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut
    le this est effectivement déjà un élément jquery. Si tu regarde les posts précédents, tu verra les syntaxes qui me retournent des infos.
    Mais c'est pas grave, car j'ai maintenant trouvé ce qui me manquais

    Sinon dans mon dernier post, en fait je parcours la première colonne de ma table (là où il y a la case à cocher que je veux contrôler)
    je regarde si elle est cocher. Si oui je mets l'ID de ma ligne dans un tableau
    à la fin je m'envoi un tableau avec les id pour faire un traitement sur plusieurs ligne de mon tableau (suppression...)

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/01/2010, 17h39
  2. [C#] communiquer avec un composant webBrowser
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 5
    Dernier message: 27/06/2006, 10h37
  3. Réponses: 12
    Dernier message: 26/03/2006, 14h13
  4. [TComport] communiquer avec un PIC
    Par tracks dans le forum C++Builder
    Réponses: 5
    Dernier message: 09/06/2004, 13h11
  5. Déployer une BDD avec son appli
    Par Albertolino dans le forum Décisions SGBD
    Réponses: 9
    Dernier message: 11/03/2004, 18h08

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