Qu'est-ce que DOM l'Événement délégation?
Quelqu'un peut-il expliquer l'événement délégation en JavaScript et comment est-il utile?
- C'est bien si il y avait un lien entre le smoe source d'information utile à ce sujet. 6 heures, c'est de la google top hit pour "dom événement de la délégation". C'est peut-être un lien utile? Je ne suis pas entièrement sûr: w3.org/TR/DOM-Level-2-Events/events.html
- Ou peut-être ceci: sitepoint.com/blogs/2008/07/23/...
- C'est une activité populaire. Même fb gars lien vers cette pour leur reactjs page davidwalsh.nom/événement-délégué
- Voir ce javascript.info/event-delegation il ne vous aidera pas beaucoup
Vous devez vous connecter pour publier un commentaire.
D'événements DOM délégation est un mécanisme de réponse de l'interface utilisateur-événements au moyen d'un seul parent commun plutôt que chaque enfant, par la magie de l'événement "bouillonnement" (aka la propagation de l'évènement).
Lorsqu'un événement est déclenché sur un élément, le suivant se produit:
De remontée d'événements fournit la fondation pour l'événement délégation dans les navigateurs. Maintenant, vous pouvez lier un gestionnaire d'événements à un seul élément parent, et que le gestionnaire sera exécuté que lorsque l'événement se produit sur l'un de ses nœuds enfants (et de leurs enfants à leur tour). C'est l'événement de la délégation. Voici un exemple de cela dans la pratique:
Avec cet exemple, si vous cliquez sur l'enfant
<li>
nœuds, vous verrez une alerte de"click!"
, même si il n'y a pas de gestionnaire de clic lié à la<li>
sur lequel vous avez cliqué. Si nous avons tenuonclick="..."
à chaque<li>
vous obtenez le même effet.Donc quel est l'avantage?
Imaginer maintenant, vous avez besoin d'ajouter dynamiquement de nouveaux
<li>
éléments de la liste ci-dessus via la manipulation DOM:Sans en utilisant les événements de la délégation que vous auriez à "relier" les
"onclick"
gestionnaire d'événement pour la nouvelle<li>
élément, pour agir de la même façon que ses frères et sœurs. Avec événement délégation vous n'avez pas besoin de faire quoi que ce soit. Il suffit d'ajouter le nouveau<li>
à la liste et vous avez terminé.C'est absolument fantastique pour les applications web avec des gestionnaires d'événement lié à de nombreux éléments, lorsque de nouveaux éléments sont créées dynamiquement et/ou retiré dans les DOM. Avec l'événement de la délégation du nombre de liaisons d'événements peut être considérablement diminué en les déplaçant d'un commun élément parent, et le code qui crée dynamiquement de nouveaux éléments à la volée peut être dissociée de la logique de la liaison de leurs gestionnaires d'événements.
Un autre avantage de l'événement, la délégation est que le total de la mémoire utilisée par les écouteurs d'événement va vers le bas (puisque le nombre de liaisons d'événements aller en bas). Il ne peut pas faire beaucoup de différence pour les petites pages qui débarquent souvent (c'est à dire de l'utilisateur de naviguer sur les différentes pages souvent). Mais pour les applications de longue durée, il peut être importante. Il y a certains vraiment difficile à suivre en cas de lorsque les éléments supprimés à partir du DOM prétendent toujours la mémoire (c'est à dire de fuite), et souvent, cette perte de mémoire est liée à un événement de liaison. Avec des événements de la délégation vous êtes libre de détruire des éléments d'enfant sans risque d'oubli "unbind" leurs écouteurs d'événement (depuis l'auditeur est sur l'ancêtre). Ces types de fuites de mémoire peuvent ensuite être contenue (si pas totalement éliminé, ce qui est freaking difficile à faire parfois. IE, je te regarde).
Voici quelques mieux béton exemples de code d'événement délégation:
focus
etflou
événements (qui ne pas bulle)<li>
quand il doit s'arrêter au<ul>
? Si ma question n'est toujours pas clair ou besoin d'un thread séparé, je serais heureux d'obliger.onclick=...
qui met en place la propagation de l'évènement. Il n'est pas. La spécification est la définition de ce qu'est un DOM/navigateur de mise en œuvre de devrait le faire lorsqu'un événement se produit. Un événement "click" (par exemple) est distribué par la mise en œuvre suite à une action de l'utilisateur, indépendamment deonclick=...
être présent dans le code ou pas! C'est seulement au cours de la propagation de cet événement que la mise en œuvre devriez regarder pour des écouteurs d'événements et de les invoquer. Leonclick=
simplement inscrit un auditeur...Cas de délégation permet d'éviter d'ajouter des écouteurs d'événement nœuds spécifiques; au lieu de cela, l'écouteur d'événement est ajouté à l'un des parents. Que l'écouteur d'événement analyse de barbotage événements de trouver une correspondance sur des éléments enfants.
Exemple En JavaScript :
Disons que nous avons un parent élément UL avec plusieurs éléments enfants:
Disons aussi que quelque chose doit se produire lorsque chaque élément enfant est cliqué. Vous pouvez ajouter un événement distinct auditeur à chaque élément LI, mais que, si LI éléments sont fréquemment ajoutés et supprimés de la liste? L'ajout et la suppression d'écouteurs d'événement serait un cauchemar, surtout si l'ajout et la suppression de code dans différents endroits au sein de votre application. La meilleure solution est d'ajouter un écouteur d'événement pour le parent de l'élément UL. Mais si vous ajoutez un écouteur d'événement pour le parent, comment savez-vous quel élément a été cliqué?
Simple: lorsque l'événement se propage jusqu'à l'élément UL, vous cochez le cas propriété target de l'objet pour obtenir une référence à la réalité de cliqué sur le nœud. Voici une très simple bout de code JavaScript qui illustre événement délégation:
Commencez par ajouter un écouteur d'événement clic de l'élément parent. Lorsque l'écouteur d'événement est déclenché, vérifiez l'événement élément pour s'assurer que c'est le type d'élément à réagir. Si c'est un élément LI, boom: nous avons ce que nous avons besoin! Si ce n'est pas un élément que nous voulons, l'événement peut être ignoré. Cet exemple est assez simple, UL et LI est une simple comparaison. Essayons quelque chose de plus difficile. Nous allons avoir un DIV parent avec beaucoup d'enfants, mais tous nous nous soucions de est un Un tag avec les classA classe CSS:
http://davidwalsh.name/event-delegate
d'événements dom délégation est quelque chose de différent à partir de l'ordinateur de la science définition.
Il se réfère à la manipulation des événements de propagation à partir de nombreux éléments, comme les cellules d'un tableau, d'un objet parent, à l'instar de la table. Il peut garder le code plus simple, en particulier lors de l'ajout ou la suppression d'éléments, et permet d'économiser de la mémoire.
Délégation est une technique où un objet exprime un certain comportement à l'extérieur, mais en réalité délègue la responsabilité de la mise en œuvre d'un comportement à un objet associé. Cela peut sembler au premier abord très similaire au modèle de proxy, mais il sert un autre but. Délégation est une abstraction d'un mécanisme qui centralise l'objet (méthode) le comportement.
Généralement parlées: utiliser la délégation comme alternative à l'héritage. L'héritage est une bonne stratégie, quand une relation étroite existe entre le parent et l'enfant objet, toutefois, l'héritage des couples d'objets de très près. Souvent, la délégation est la plus souple pour exprimer une relation entre les classes.
Ce modèle est également connu comme "proxy chaînes". Plusieurs autres modèles de conception de l'utilisation de la délégation de l'État, de la Stratégie et des Visiteurs et des Modèles en dépendent.
La délégation concept
Si il y a de nombreux éléments à l'intérieur de l'un des parents, et que vous souhaitez gérer les événements sur eux d'entre eux - ne se lient pas les maîtres de chaque élément.
Au lieu de cela, lier le seul gestionnaire de leur parent, et demandez à l'enfant de l'événement.cible.
Ce site fournit des informations utiles sur la façon de mettre en œuvre des événements de la délégation.
http://javascript.info/tutorial/event-delegation
Cas de délégation est de gérer un événement qui bulles à l'aide d'un gestionnaire d'événement sur un élément de conteneur, mais seulement l'activation du gestionnaire d'événement du problème si l'événement s'est produit sur un élément dans le conteneur qui correspond à une condition donnée. Cela peut simplifier la gestion des événements sur les éléments à l'intérieur du conteneur.
Par exemple, supposons que vous souhaitez gérer un cliquez sur une cellule de tableau dans un tableau. Vous pourrait écrire une boucle pour accrocher un gestionnaire de clic sur chaque cellule...ou vous pouvez raccorder un gestionnaire de clic sur la table et utiliser l'événement de la délégation à la déclencher uniquement pour les cellules de tableau (et non pas en-têtes de tableau, ou les espaces à l'intérieur d'une ligne autour des cellules, etc.).
Il est également utile lorsque vous êtes va être l'ajout et la suppression d'éléments du conteneur, parce que vous n'avez pas à vous inquiéter au sujet de l'ajout et de la suppression des gestionnaires d'événements sur ces éléments; il suffit de raccorder l'événement sur le conteneur et la poignée de l'événement quand il bulles.
Voici un exemple simple (c'est intentionnellement détaillé pour permettre inline explication): la Manipulation d'un clic sur n'importe quel
td
élément dans un conteneur de table:JS:
CSS:
HTML:
Avant d'entrer dans les détails, rappelons-nous comment les événements DOM travail.
DOM événements sont expédiés à partir du document de l'élément cible (le capture phase), puis de la bulle de l'élément cible, le document (le bouillonnement phase). Ce graphique dans l'ancien DOM3 événements spec (maintenant remplacé, mais le graphique est toujours valable) le montre très bien:
Pas tous les événements de la bulle, mais la plupart le font, y compris
click
.Les commentaires dans l'exemple de code ci-dessus décrivent la façon dont il fonctionne.
correspond à
vérifie si un élément correspond à un sélecteur CSS, mais bien sûr, vous pouvez vérifier si quelque chose correspond à vos critères dans d'autres façons, si vous ne voulez pas utiliser un sélecteur CSS.Que le code est écrit pour appeler les différentes étapes avec beaucoup de détails, mais vaguement les navigateurs modernes (et aussi sur IE si vous utilisez un polyfill), vous pouvez utiliser
proche
etcontient
au lieu de la boucle:Live Exemple:
JS:
CSS:
HTML:
closest
vérification de l'élément que vous appeler pour voir si elle correspond à la donnée sélecteur CSS et, si elle ne renvoie le même élément; dans le cas contraire, il vérifie si l'élément parent pour voir si elle correspond, et renvoie le parent si oui; dans le cas contraire, il vérifie le parent du parent, etc. Donc, il trouve le "plus proche" de l'élément dans l'ancêtre de la liste qui correspond au sélecteur. Depuis que pourraient aller au-delà de l'élément conteneur, le code ci-dessus utilisecontains
de vérifier si un élément correspondant a été trouvé, c'est dans le conteneur — depuis par d'accroche de l'événement sur le conteneur, vous avez indiqué que vous ne voulez gérer les éléments dans conteneur.Pour en revenir à notre exemple de table, ce qui signifie que si vous avez un tableau dans une cellule de tableau, il ne correspondra pas à la cellule du tableau contenant la table:
JS:
CSS:
HTML:
C'est fondamentalement la manière dont l'association est constituée de l'élément. .cliquez sur s'applique à la présente DOM, tandis que .sur les (à l'aide de la délégation) continuera d'être valable pour les nouveaux éléments ajoutés à la DOM après un événement de l'association.
Ce qui est mieux pour l'utilisation, je dirais que cela dépend du cas.
Exemple:
.Cliquez Sur L'Événement:
Événement .sur:
Remarque que j'ai séparé le sélecteur dans le .sur. Je vais vous expliquer pourquoi.
Supposons que, après cette association, laissez-nous effectuer les opérations suivantes:
C'est là que vous remarquerez la différence.
Si l'événement a été associé par .cliquez sur, une tâche 5 ne sera pas obéir à l'événement de clic, et donc il ne sera pas supprimé.
Si il a été associé par .sur, avec le sélecteur séparés, il va obéir.
Un délégué en C# est semblable à un pointeur de fonction en C ou C++. À l'aide d'un délégué permet au programmeur d'encapsuler une référence à une méthode à l'intérieur d'un délégué de l'objet. Le délégué de l'objet peut ensuite être transmis à un code qui peut appeler référencé dans la méthode, sans avoir à connaître au moment de la compilation de la méthode qui sera invoquée.
Voir ce lien --> http://www.akadia.com/services/dotnet_delegates_and_events.html
Événement délégation a fait usage de deux souvent négligé caractéristiques des événements JavaScript: remontée d'événements et de l'élément cible.Lorsqu'un événement est déclenché sur un élément, par exemple un clic de souris sur un bouton, le même événement est également déclenchée sur l'ensemble de cet élément ancêtres. Ce processus est connu comme la remontée d'événements; l'événement bulles à partir de l'origine de l'élément en haut de l'arborescence DOM.
Imaginer un tableau HTML avec 10 colonnes et 100 lignes dans lequel vous voulez quelque chose de se produire lorsque l'utilisateur clique sur une cellule de tableau. Par exemple, une fois, j'ai eu à faire de chaque cellule d'un tableau de taille modifiable lorsque l'utilisateur clique dessus. Ajouter des gestionnaires d'événements pour chacun des 1 000 cellules serait l'un des principaux problèmes de rendement et, potentiellement, une source de navigateur s'écraser les fuites de mémoire. Au lieu de cela, à l'aide de cas de délégation, vous ajoutez un seul gestionnaire d'événement à l'élément de tableau, d'intercepter l'événement click et de déterminer lequel la cellule a été cliqué.