diff --git a/2-ui/2-events/05-dispatch-events/article.md b/2-ui/2-events/05-dispatch-events/article.md index e667bf741..a19d61b71 100644 --- a/2-ui/2-events/05-dispatch-events/article.md +++ b/2-ui/2-events/05-dispatch-events/article.md @@ -1,16 +1,16 @@ -# Dispatching custom events +# Distribution d'événements personnalisés -We can not only assign handlers, but also generate events from JavaScript. +Nous pouvons non seulement affecter des gestionnaires, mais également générer des événements à partir de JavaScript. -Custom events can be used to create "graphical components". For instance, a root element of our own JS-based menu may trigger events telling what happens with the menu: `open` (menu open), `select` (an item is selected) and so on. Another code may listen for the events and observe what's happening with the menu. +Les événements personnalisés peuvent être utilisés pour créer des "composants graphiques". Par exemple, un élément racine de notre propre menu basé sur JS peut déclencher des événements indiquant ce qui se passe avec le menu: `open` (menu ouvert), `select` (un élément est sélectionné) et ainsi de suite. Un autre code peut écouter les événements et observer ce qui se passe avec le menu. -We can generate not only completely new events, that we invent for our own purposes, but also built-in ones, such as `click`, `mousedown` etc. That may be helpful for automated testing. +Nous pouvons générer non seulement des événements complètement nouveaux, que nous inventons pour nos propres besoins, mais aussi des événements intégrés, tels que `click`, `mousedown`, etc. Cela peut être utile pour les tests automatisés. -## Event constructor +## Constructeur d'événements -Build-in event classes form a hierarchy, similar to DOM element classes. The root is the built-in [Event](http://www.w3.org/TR/dom/#event) class. +Les classes d'événements intégrées forment une hiérarchie, similaire aux classes d'éléments DOM. La racine est la classe intégrée [Event](http://www.w3.org/TR/dom/#event). -We can create `Event` objects like this: +Nous pouvons créer des objets `Event` comme ceci: ```js let event = new Event(type[, options]); @@ -18,20 +18,20 @@ let event = new Event(type[, options]); Arguments: -- *type* -- event type, a string like `"click"` or our own like `"my-event"`. -- *options* -- the object with two optional properties: - - `bubbles: true/false` -- if `true`, then the event bubbles. - - `cancelable: true/false` -- if `true`, then the "default action" may be prevented. Later we'll see what it means for custom events. +- *type* -- type d'événement, soit une chaîne comme `"click"` ou la nôtre comme `"my-event"`. +- *options* -- l'objet avec deux propriétés facultatives: + - `bubbles: true/false` -- si `true`, alors l'événement bouillonne. + - `cancelable: true/false` -- si `true`, alors "l'action par défaut" peut être empêchée. Plus tard, nous verrons ce que cela signifie pour les événements personnalisés. - By default both are false: `{bubbles: false, cancelable: false}`. + Par défaut, les deux sont "false": `{bubbles: false, cancelable: false}`. ## dispatchEvent -After an event object is created, we should "run" it on an element using the call `elem.dispatchEvent(event)`. +Après la création d'un objet événement, nous devons le "lancer" sur un élément en utilisant l'appel `elem.dispatchEvent(event)`. -Then handlers react on it as if it were a regular browser event. If the event was created with the `bubbles` flag, then it bubbles. +Ensuite, les gestionnaires réagissent comme s'il s'agissait d'un événement de navigateur normal. Si l'événement a été créé avec le marqueur `bubbles`, alors il bouillonne. -In the example below the `click` event is initiated in JavaScript. The handler works same way as if the button was clicked: +Dans l'exemple ci-dessous l'événement `click` est initié avec JavaScript. Le gestionnaire fonctionne de la même manière que si le bouton était cliqué: ```html run no-beautify @@ -43,46 +43,46 @@ In the example below the `click` event is initiated in JavaScript. The handler w ``` ```smart header="event.isTrusted" -There is a way to tell a "real" user event from a script-generated one. +Il existe un moyen de distinguer un événement utilisateur "réel" d'un événement généré par script. -The property `event.isTrusted` is `true` for events that come from real user actions and `false` for script-generated events. +La propriété `event.isTrusted` est `true` pour les événements qui proviennent d'actions réelles de l'utilisateur et `false` pour les événements générés par un script. ``` -## Bubbling example +## Exemple de bouillonnement -We can create a bubbling event with the name `"hello"` and catch it on `document`. +Nous pouvons créer un événement qui bouillonne avec le nom `"hello"` et l'attraper sur `document`. -All we need is to set `bubbles` to `true`: +Tout ce dont nous avons besoin de faire est de définir `bulles` en tant que `true`: ```html run no-beautify
@@ -187,10 +187,10 @@ Any handler can listen for that event with `rabbit.addEventListener('hide',...)` ``` -Please note: the event must have the flag `cancelable: true`, otherwise the call `event.preventDefault()` is ignored. +Remarque: l'événement doit avoir le marqueur `cancelable: true`, sinon l'appel `event.preventDefault()` est ignoré. -## Events-in-events are synchronous +## Les événements imbriqués sont synchrones -Usually events are processed in a queue. That is: if the browser is processing `onclick` and a new event occurs, e.g. mouse moved, then it's handing is queued up, corresponding `mousemove` handlers will be called after `onclick` processing is finished. +Les événements sont généralement traités dans une file d'attente. C'est-à-dire: si le navigateur traite `onclick` et qu'un nouvel événement se produit, par exemple la souris est déplacée, puis sa gestion est mise en file d'attente, les gestionnaires `mousemove` correspondants seront appelés après la fin du traitement `onclick`. -The notable exception is when one event is initiated from within another one, e.g. using `dispatchEvent`. Such events are processed immediately: the new event handlers are called, and then the current event handling is resumed. +L'exception notable est lorsqu'un événement est déclenché à partir d'un autre, par exemple en utilisant `dispatchEvent`. Ces événements sont traités immédiatement: les nouveaux gestionnaires d'événements sont appelés, puis la gestion des événements en cours est reprise. -For instance, in the code below the `menu-open` event is triggered during the `onclick`. +Par exemple, dans le code ci-dessous, l'événement `menu-open` est déclenché pendant `onclick`. -It's processed immediately, without waiting for `onlick` handler to end: +Il est traité immédiatement, sans attendre la fin du gestionnaire `onclick`: ```html run autorun @@ -234,20 +234,20 @@ It's processed immediately, without waiting for `onlick` handler to end: alert(2); }; - // triggers between 1 and 2 + // se déclenche entre 1 et 2 document.addEventListener('menu-open', () => alert('nested')); ``` -The output order is: 1 -> nested -> 2. +L'ordre de sortie est: 1 -> imbriqué -> 2. -Please note that the nested event `menu-open` is caught on the `document`. The propagation and handling of the nested event is finished before the processing gets back to the outer code (`onclick`). +Veuillez noter que l'événement imbriqué `menu-open` est intercepté sur le `document`. La propagation et la gestion de l'événement imbriqué sont terminées avant que le traitement ne revienne au code externe (`onclick`). -That's not only about `dispatchEvent`, there are other cases. If an event handler calls methods that trigger to other events -- they are too processed synchronously, in a nested fashion. +Il ne s'agit pas seulement de`dispatchEvent`, il y a d'autres cas. Si un gestionnaire d'événements appelle des méthodes qui déclenchent d'autres événements, ils sont également traités de manière synchrone, de manière imbriquée. -Let's say we don't like it. We'd want `onclick` to be fully processed first, independently from `menu-open` or any other nested events. +Disons que nous n'aimons pas ça. Nous voudrions que `onclick` soit entièrement traité en premier, indépendamment de `menu-open` ou de tout autre événement imbriqué. -Then we can either put the `dispatchEvent` (or another event-triggering call) at the end of `onclick` or, maybe better, wrap it in the zero-delay `setTimeout`: +Alors, nous pouvons soit mettre le `dispatchEvent` (ou un autre appel déclencheur d'événement) à la fin de `onclick` ou, peut-être mieux, l'envelopper dans `setTimeout`: ```html run @@ -267,29 +267,29 @@ Then we can either put the `dispatchEvent` (or another event-triggering call) at ``` -Now `dispatchEvent` runs asynchronously after the current code execution is finished, including `mouse.onclick`, so event handlers are totally separate. +Désormais, `dispatchEvent` s'exécute de manière asynchrone une fois l'exécution du code en cours terminée, y compris `mouse.onclick`, les gestionnaires d'événements sont donc totalement séparés. -The output order becomes: 1 -> 2 -> nested. +L'ordre de sortie devient: 1 -> 2 -> imbriqué. -## Summary +## Résumé -To generate an event from code, we first need to create an event object. +Pour générer un événement à partir du code, nous devons d'abord créer un objet événement. -The generic `Event(name, options)` constructor accepts an arbitrary event name and the `options` object with two properties: -- `bubbles: true` if the event should bubble. -- `cancelable: true` if the `event.preventDefault()` should work. +Le constructeur générique `Event(name, options)` accepte un nom d'événement arbitraire et l'objet `options` avec deux propriétés: +- `bubbles: true` si l'événement doit bouillonner. +- `cancelable: true` si `event.preventDefault()` doit fonctionner. -Other constructors of native events like `MouseEvent`, `KeyboardEvent` and so on accept properties specific to that event type. For instance, `clientX` for mouse events. +D'autres constructeurs d'événements natifs tels que `MouseEvent`, `KeyboardEvent` et ainsi de suite acceptent des propriétés spécifiques à ce type d'événement. Par exemple, `clientX` pour les événements de souris. -For custom events we should use `CustomEvent` constructor. It has an additional option named `detail`, we should assign the event-specific data to it. Then all handlers can access it as `event.detail`. +Pour les événements personnalisés, nous devons utiliser le constructeur `CustomEvent`. Il a une option supplémentaire nommée `detail`, nous devons lui attribuer les données spécifiques à l'événement. Ensuite, tous les gestionnaires peuvent y accéder en tant que `event.detail`. -Despite the technical possibility to generate browser events like `click` or `keydown`, we should use with the great care. +Malgré la possibilité technique de générer des événements de navigateur comme `click` ou `keydown`, nous devons les utiliser avec le plus grand soin. -We shouldn't generate browser events as it's a hacky way to run handlers. That's a bad architecture most of the time. +Nous ne devrions pas générer d'événements de navigateur car c'est une manière pirate d'exécuter des gestionnaires. C'est une mauvaise architecture la plupart du temps. -Native events might be generated: +Des événements natifs peuvent être générés: -- As a dirty hack to make 3rd-party libraries work the needed way, if they don't provide other means of interaction. -- For automated testing, to "click the button" in the script and see if the interface reacts correctly. +- En tant que bidouille pour faire fonctionner les bibliothèques tierces de la manière nécessaire, si elles ne fournissent pas d'autres moyens d'interaction. +- Pour les tests automatisés, pour "cliquer sur le bouton" dans le script et voir si l'interface réagit correctement. -Custom events with our own names are often generated for architectural purposes, to signal what happens inside our menus, sliders, carousels etc. +Les événements personnalisés avec nos propres noms sont souvent générés à des fins architecturales, pour signaler ce qui se passe dans nos menus, curseurs, carrousels, etc. \ No newline at end of file