VersionIntroductionInstallationLimitations du protocole "file"Questions fréquemment poséesSyntaxe, mots-clés et fonctions intégréesDistribution standardImplémentation de importPackages BrythonInterface avec le navigateur
Introduction - API DOM
Créer un document Accéder aux éléments Attributs, propriétés et méthodes Evénements Evénements souris Evénements clavier Evénements focus Evénements pour glisser-déposer Chaine de requête Interactions avec Javascript Modules intégrés propres à Brython
browser
browser.aio browser.ajax browser.html browser.local_storage browser.markdown browser.object_storage browser.session_storage browser.svg browser.template browser.timer browser.webcomponent browser.websocket browser.worker Widgets browser.widgets.dialog browser.widgets.menu interpreter javascript Travailler avec BrythonRecettes
Salut !
Insérer du contenu dans un élément Mise en forme HTML (gras, italique...) Table HTML Attacher / détacher des événements Gérer la sélection d'options dans un SELECT Glisser-déposer Obtenir le contenu d'un élément Lire le contenu d'un fichier Stocker des objets localement Exemple de onmouseover |
Le module browser.webcomponent permet de créer des balises HTML personnalisées, en utilisant la technologie DOM standard WebComponent. Un élément personnalisé est utilisé dans une page HTML sous la forme<popup-window>Coucou !</popup-window>Le module expose les fonctions suivantes define( nom_balise, classe_composant[, options])
nom_balise est le nom de la balise personnalisée. La spécification Web Component impose que ce nom inclue un tiret (le caractère " options est un dictionnaire avec les options du composant (cf la documentation de define). La seule option disponible actuellement est "extends". class MyParagraph: def __init__(self): self.shadow = self.attachShadow({'mode': 'open'}) self.shadow <= html.B('hello') define('my-paragraph', MyParagraph, {'extends': 'p'}) Si la classe du composant hérite d'une classe définie dans le module browser.html, l'option "extends" est automatiquement ajoutée avec comme valeur le nom de cette classe. Le code ci-dessus peut donc être remplacé par from browser import html class MyParagraph(html.P): def __init__(self): self.shadow = self.attachShadow({'mode': 'open'}) self.shadow <= html.B('hello') define('my-paragraph', MyParagraph) get( nom_balise)
renvoie la classe associée à nom_balise, ou
ExempleSupposons que nous voulions définir une balise personnalisée<bold-italic>
qui possède un attribut "data-val ":
<bold-italic data-val="salut"></bold-italic>Ce qui se produit quand la balise apparait dans le document HTML est défini par la méthode __init__ de la classe BoldItalic qui gère cette balise.
Notez l'utilisation d'une autre technologie DOM, ShadowRoot, pour définir un sous-arbre du DOM, différent de l'arbre principal.from browser import webcomponent class BoldItalic: def __init__(self): # Create a shadow root shadow = self.attachShadow({'mode': 'open'}) # Insert the value of attribute "data-val" in bold italic # in the shadow root shadow <= html.B(html.I(self.attrs['data-val'])) # Indique au navigateur de gérer la balise <bold-italic> avec la classe # BoldItalic webcomponent.define("bold-italic", BoldItalic) Gestion du cycle de vieLa technologie Web Component definit un ensemble de fonctions de rappel qui gèrent le cycle de vie d'un composant personnalisé. Pour les implémenter en Brython, il suffit d'ajouter ces fonctions dans la définition de la classe:Pour gérer les changements apportés à certains attributs, ajouter la listeimport browser.webcomponent class BoldItalic: def __init__(self): # Create a shadow root shadow = self.attachShadow({'mode': 'open'}) # Insert the value of attribute "data-val" in bold italic # in the shadow root shadow <= html.B(html.I(self.attrs['data-val'])) def connectedCallback(self): print("connected callback", self) webcomponent.define("bold-italic", BoldItalic) observedAttributes et la méthode attributeChangedCallback() comme
ci-dessous (notez que cette fois un nouveau composant personnalisé est créé
en utilisant la fonction maketag du module browser.html et ajouté
dynamiquement au document):
observed_tag = html.maketag("observed-element") class Observed: observedAttributes = ["data"] def attributeChangedCallback(self, name, old, new, ns): print(f"attribute {name} changed from {old} to {new}") webcomponent.define("observed-element", Observed) elt = observed_tag() document <= elt elt.attrs["data"] = "info" |