JavaScript event streaming: in-depth understanding of event processing and propagation mechanisms

Insert image description here

introduction

Event streaming in JavaScript is a mechanism for describing and processing the propagation of events in the DOM tree. Understanding the properties and workings of event streams is critical to writing efficient event handling code and implementing complex interactive features. This article will introduce in detail the development process, properties and application scenarios of JavaScript event streams, and provide some code examples and reference materials to help readers deeply understand and apply this important front-end technology.

1. Development process of event stream

Event streaming has gone through some changes and evolutions during the development of the front-end.

1.1 Traditional DOM level 0 events

In early JavaScript, event handling was implemented by directly defining event handling attributes on DOM elements, called DOM level 0 events. onclickFor example, you can define a handler for a click event by assigning a function to a button element's property.

const button = document.getElementById('myButton');
button.onclick = function() {
    
    
  console.log('按钮被点击');
};

This method is simple and straightforward, but one disadvantage is that you cannot add multiple handlers for the same event type of an element at the same time.

1.2 DOM2-level events and addEventListener method

With the introduction of DOM2-level events, new methods have been added addEventListenerto provide more powerful and flexible event processing capabilities. addEventListenerMethods allow adding multiple handlers for the same event type on an element and can control the capture phase of the event.

const button = document.getElementById('myButton');
button.addEventListener('click', function() {
    
    
  console.log('按钮被点击');
});

Methods addEventListenerallow you to add multiple handlers to an element at the same time, and removeEventListenermethods can be used to remove specific handlers.

1.3 W3C DOM level 3 events

W3C DOM3 level events further expand the types and attributes of events, introducing more event types and characteristics to meet the growing needs of front-end development. The DOM3-level event specification defines new event types, such as scroll events, touch events, transition events, etc., as well as some new event attributes and methods, providing richer event processing capabilities.

const element = document.getElementById('myElement');
element.addEventListener('scroll', function(event) {
    
    
  console.log('元素滚动事件');
});

The introduction of DOM3-level events enriches event processing capabilities, allowing developers to respond to various types of events more flexibly.

1.4 React与Virtual DOM

With the emergence of front-end frameworks such as React, the event processing mechanism has also undergone some changes. React uses the concept of Virtual DOM to transfer event processing from direct manipulation of the DOM to component level management. React takes advantage of synthetic events (

SyntheticEvent) to handle events, achieving cross-browser consistency and performance optimization.

In React, event handlers are bound to components through specific syntax and attributes, rather than manipulating DOM elements directly.

class MyComponent extends React.Component {
  handleClick() {
    console.log('按钮被点击');
  }

  render() {
    return <button onClick={this.handleClick}>点击按钮</button>;
  }
}

By using synthetic events, React can manage event processing more efficiently and provide better performance and development experience.

2. Properties of event streams

Event flow involves three main concepts: event capture phase, target phase and event bubbling phase. Understanding these stages and associated properties is critical to understanding the mechanics of event flow.

2.1 Event capture phase

The event capture phase is the first phase of the event flow, starting from the root node and propagating downward to the target element. In the event capture phase, the event passes through each parent element in turn until it reaches the target element.

In the event capture phase, you can use addEventListenerthe third parameter to specify the event handler to execute during the capture phase.

element.addEventListener('click', handler, true);

2.2 Target stage

The target stage is the second stage of the event flow. After the event reaches the target element, it is triggered to execute the event handler.

2.3 Event bubbling stage

The event bubbling phase is the last phase of the event flow. The event bubbles up from the target element, passing through each parent element in turn, until it reaches the root node.

During the bubbling phase of an event, addEventListenerthe third parameter can be set to falseor omitted to specify that the event handler executes during the bubbling phase (the default).

element.addEventListener('click', handler, false);
// 或
element.addEventListener('click', handler);

2.4 Event object

In the event handler, event information related to the operation can be accessed through the event object. The event object provides some properties and methods to obtain the event type, target element, mouse coordinates and other information.

For example, the event type can be obtained through typethe properties of the event object:

element.addEventListener('click', function(event) {
    
    
  console.log(event.type); // 输出 'click'
});

3. Application scenarios of event streaming

Event streaming has a wide range of application scenarios in front-end development

3.1 Event handling

Event streams provide a mechanism for processing and responding to user interactions. By registering an event handler on the target element, user-triggered events can be captured and processed to implement interactive functions.

clickFor example, by registering an event handler on a button , you can

Execute the corresponding code logic when the button is clicked.

const button = document.getElementById('myButton');
button.addEventListener('click', function(event) {
    
    
  console.log('按钮被点击');
});

3.2 Event Agent

Event Delegation is a common optimization technique used to handle a large number of child element events with similar behavior. By registering an event handler on the parent element, you can use the event bubbling mechanism to uniformly manage the event processing of child elements.

For example, you can register an event handler on a parent element clickto perform different actions depending on the specific child element that triggered the event.

const list = document.getElementById('myList');
list.addEventListener('click', function(event) {
    
    
  if (event.target.tagName === 'LI') {
    
    
    console.log('项目被点击');
  }
});

3.3 Event delegation

Event delegation is a technique that improves performance and simplifies code by delegating event handling to parent elements. It uses the event bubbling mechanism to register an event handler on the parent element to handle the same event on multiple child elements.

For example, you can register an event handler on a parent element clickto perform different actions based on the different categories of child elements that triggered the event.

const container = document.getElementById('myContainer');
container.addEventListener('click', function(event) {
    
    
  if (event.target.classList.contains('button')) {
    
    
    console.log('按钮被点击');
  } else if (event.target.classList.contains('link')) {
    
    
    console.log('链接被点击');
  }
});

4. Sample code

<button id="myButton">点击按钮</button>
<ul id="myList">
  <li>项目1</li>
  <li>项目2</li>
  <li>项目3</li>
</ul>
<div id="myContainer">
  <button class="button">按钮</button>
  <a href="#" class="link">链接</a>
</div>

<script>
  // 事件处理示例
  const button = document.getElementById('myButton');
  button.addEventListener('click', function(event) {
      
      
    console.log('按钮被点击');
  });

  // 事件代理示例
  const list = document.getElementById('myList');
  list.addEventListener('click', function(event) {
      
      
    if (event.target.tagName === 'LI') {
      
      
      console.log('项目被点击');
    }
  });

  // 事件委托示例
  const container = document.getElementById('myContainer');
  container.addEventListener('click', function(event) {
      
      
    if (event.target.classList.contains('button')) {
      
      
      console.log('按钮被点击');
    } else if (event.target.classList.contains('link')) {
      
      
      console.log('链接被点击');
    }
  });
</script>

5. References

Guess you like

Origin blog.csdn.net/weixin_52898349/article/details/132846566