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 :

Intégration Greasemonkey / TinyMCE


Sujet :

Bibliothèques & Frameworks

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 44
    Points : 38
    Points
    38
    Par défaut Intégration Greasemonkey / TinyMCE
    Bonjour à tous,

    Je travaille en ce moment sur un userscript (avec Tampermonkey) pour me faciliter l'utilisation d'un site web. Ce site utilise TinyMCE v4.

    Dans mon script je souhaite mettre en contenu par défaut au sein de l'éditeur TinyMCE (activeEditor). Je précise que ce n'est pas mon script qui charge et instancie TinyMCE ...

    Actuellement je mets un setTimeout de 3 seconde pour être sûr que TinyMCE est instancié avant de l'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    setTimeout( function(e) {
        tinyMCE.activeEditor.insertContent( 'test' );
    }, 3000 );
    Cela fait le job, mais ... en fait cela n'attends pas vraiment que TinyMCE soit prêt, et si cela prends plus de 3 secondes à la page pour se charger (cela arrive) alors j'ai une jolie erreur dans la console (tinyMCE is not defined) et le job n'est pas fait ... pas cool ...

    J'ai donc essayé d'autres solutions, et j'en suis à faire un système de boucle super moche :

    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
    waitForTinymce( function(e) {
    	waitForEditor( function(e) {
    		setTimeout( function(e) {
    			tinyMCE.activeEditor.insertContent( 'test' );
    		},100 );
    	});
    });
     
    function waitForTinymce( callback ) {
    	if( typeof( tinyMCE ) !== 'undefined' ) {
    		callback();
    	} else {
    		setTimeout( function(e) {
    			waitForTinymce( callback );
    		},100);
    	}
    }
     
    function waitForEditor( callback ) {
    	if( tinyMCE.activeEditor !== null ) {
    		callback();
    	} else {
    		setTimeout( function(e) {
    			waitForEditor( callback );
    		},100);
    	}
    }
    Cela fonctionne en apparence, mais c'est moche et pas vraiment pertinent en fait ...

    Ma question est donc : est-ce que vous connaissez un moyen d'utiliser le modèle événementiel pour attendre l'éditeur TinyMCE et pour travailler avec ? Si oui, quel événement dois-je écouter, et surtout comment l'implémenter dans mon userscript ?

    D'avance merci !

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Bonsoir,
    j’enfonce sans doute des portes ouvertes, mais as-tu essayé d’attendre les évènements DOMContentLoaded et load ?

    En regardant dans la doc, je n’ai pas eu l’impression que TinyMCE est chargé de manière asynchrone. Regarde dans le code du site que tu veux enrichir, si la balise <script> chargée d’initialiser TinyMCE a un attribut async ou defer. Si elle n’en a pas, tu pourras probablement agir sur DOMContentLoaded. Sinon, il faut recourir à une bidouille comme tu as fait.

    Il y a peut-être une solution à base de Object.defineProperty, mais je ne garantis pas son fonctionnement, et encore moins des performances optimales. L’idée est de mettre un « hook » sur le nom de variable tinymce, ce qui te permettra d’agir au moment précis où une valeur est donnée à cette variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    let _tinymce;
    Object.defineProperty(window, "tinymce", {
      get() {
        return _tinymce;
      },
      set(value) {
        _tinymce = value;
        console.log("tinymce has been modified");
      },
      enumerable: true,
    });
    Un problème : si le site déclare tinymce avec le mot-clé let, ce ne sera pas une propriété de window et donc tu ne pourras pas agir dessus.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 44
    Points : 38
    Points
    38
    Par défaut
    Merci pour ta réponse Watilin.

    J'avais essayé load, mais je ne pouvais pas surcharger l'instanciation de l'objet TinyMCE ... Ou du moins les écouteurs ne fonctionnait pas ...
    Je vais regarder DOMContentLoaded.

    Après ton avis me "rassure" sur ma compréhension du problème ...

    Je vais également regarder du côté de Object.defineProperty, mais je soupçonne que le problème reste le même qu'avec load en fait ...

    Je reviens là dessus en début de semaine prochaine pour faire un retour.

    Encore merci.

Discussions similaires

  1. Outil de mise en page : TinyMCE et son intégration
    Par Phoceen39 dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 01/11/2014, 17h00
  2. TinyMCE et intégration jQuery
    Par laloune dans le forum jQuery
    Réponses: 1
    Dernier message: 21/05/2013, 20h35
  3. [TinyMCE] Intégration KCfinder dans tinyMce
    Par vocal94130 dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 17/02/2011, 14h13
  4. [NETBEANS] Intégration de Jboss dans NetBeans
    Par Kleb dans le forum NetBeans
    Réponses: 1
    Dernier message: 09/06/2003, 18h45

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