发布订阅模式的例子

本文介绍如何使用原生JavaScript的createEvent方法创建自定义事件,并通过initEvent方法进行初始化,包括设置事件类型、是否允许冒泡及取消默认行为等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原生JS有一个createEvent方法, 跟createElement类似, 不过前者是用来创建自定义事件的. 如下:

// createEvent的参数最好是"event/HTMLEvents/UIEvents/MouseEvents"中的任意一个; 其他的会报错, 导致创建事件失败
var evt = document.createEvent("event");

/*initEvent(eventType, canBubble, cancelable): 初始化事件
 *
 *eventType: string, 事件类型, 如--"click", "clicktest"
 *canBubble: boolean, 是否允许事件冒泡?(默认值=true)
 *cancelable: boolean, 是否允许执行默认事件?(默认值=true)
 *
 */
 evt.initEvent("click", true, true); // 初始化完毕

 // 给实例化事件对象新增属性, 用以区分默认事件对象
 evt.nameOfInstance = "instanceName";
 evt.createTime = new Date();

 // 绑定事件
 window.addEventListener("click", function(e){
     console.log(e.nameOfInstance+"---"+e.createTime);
 });

 // dispatchEvent:派发事件(===事件执行阶段)
 window.dispatchEvent(evt); //如果不加, 自定义事件是不会生效的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

最终console面板显示的是: instanceName—Wed Jun 21 2017 16:47:23 GMT+0800 (中国标准时间)
点击window后, 显示: undefined—undefined

在 Spring Boot 中,可以使用 Spring Framework 提供的事件机制实现发布订阅模式。下面是一个简单的例子: 首先,我们创建一个自定义事件 MyEvent: ``` public class MyEvent extends ApplicationEvent { private String message; public MyEvent(Object source, String message) { super(source); this.message = message; } public String getMessage() { return message; } } ``` 然后,我们创建一个事件发布者 MyPublisher,用来发布 MyEvent 事件: ``` @Component public class MyPublisher { @Autowired private ApplicationEventPublisher publisher; public void publishEvent(String message) { MyEvent event = new MyEvent(this, message); publisher.publishEvent(event); } } ``` 最后,我们创建一个事件订阅者 MySubscriber,用来订阅 MyEvent 事件: ``` @Component public class MySubscriber { @EventListener public void handleEvent(MyEvent event) { System.out.println("Received message: " + event.getMessage()); } } ``` 在上面的代码中,我们使用 @Autowired 注解注入了 ApplicationEventPublisher 对象,然后在 publishEvent() 方法中创建了 MyEvent 事件,并通过 publishEvent() 方法发布事件。在 MySubscriber 类中,我们使用 @EventListener 注解标注了 handleEvent() 方法,该方法会在 MyEvent 事件被发布时被调用。 现在,我们可以在任何地方注入 MyPublisher 对象,并调用 publishEvent() 方法发布 MyEvent 事件。例如,在一个 Controller 中: ``` @RestController public class MyController { @Autowired private MyPublisher publisher; @GetMapping("/publish") public String publishEvent() { publisher.publishEvent("Hello, world!"); return "Event published."; } } ``` 当我们访问 /publish 路径时,会调用 publishEvent() 方法发布一个 MyEvent 事件,并在 MySubscriber 类中的 handleEvent() 方法中输出 "Received message: Hello, world!"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值