Bonsoir,
Je viens de terminer de migrer mes plugins TTSCast et TVRemote en vanilla JS (les deux sur la branche béta).
Au delà du temps que cela prend
(et que j’aime toujours autant le Javascript
), globalement cela fonctionne bien à l’arrivée, et même avec des performances un peu meilleures (d’après la console dev de Chrome en tout cas) sur le traitement et le chargement des éléments des pages.
Globalement, j’ai pu tester la migration de « click » sur des boutons, d’ouverture de pages sur un nouvel onglet au click sur un bouton, d’envoi de fichier (téléchargement d’un fichier qui s’ajoute à un répertoire du plugin), lancement d’Ajax en tout genre, construction de la table de commandes, etc…
Mais je n’ai pas pu éradiquer le jQuery à 100%
, il reste une toute petite fonction dans le code, et c’est l’objet de ce message
:
- Les « CustomEvents »
J’utilise des customevents sur la page de ces deux plugins, notamment pour gérer des évènements comme l’envoi et le retour de code d’appairage, ou le lancement et l’arrêt d’un scan automatique d’équipements.
Or, lorsque j’implémente les eventListener('ttscast::scanState, ...) par exemple, en vanilla JS, ils ne réagissent pas dans Jeedom lorsque je clique sur le bouton « Scan ».
Pour que cela fonctionne, j’ai dû implémenter un bridge jQuery vers CustomEvents :
Et là cela fonctionne comme attendu.
PS : Alors oui, en désactivant le jQuery complètement de Jeedom via l’option du panneau de configuration, cela fonctionne, mais là l’idée était de profiter, dans cette période de transition, du Vanilla JS pour les plugins qui le supportent sans pour autant forcer l’utilisateur à désactiver le jQuery… ![]()
Après un bon moment à chercher, j’ai regardé dans le code du core de Jeedom, et j’ai fini par trouver que cela pourrait venir de ce bout de code :
Fichier core/js/jeedom.class.js (lignes 84 à 94) :
Et je me demandais pourquoi avoir filtrer pour n’autoriser le dispatchEvent « natif » que sur certains types de customevents et ne pas autoriser tous les customevents à être dispatchés en vanilla JS et laisser le jQuery comme sorte de fallback (les deux tourneraient donc) ?
par exemple via ce code modifié :
const eventName = data.result[i].name
if (eventName) {
const eventDetail = isset(data.result[i].option) ? data.result[i].option : undefined
document.body.dispatchEvent(new CustomEvent(eventName, { detail: eventDetail }))
if (typeof jQuery === 'function') {
$('body').trigger(eventName, eventDetail)
}
}
Suivant vos réponses et retour sur le sujet, je pourrai proposer ce bout de code en PR sur la branche 4.5.2
Bonne soirée,
TiTidom.