You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

浏览器中Javascript向Dart传递自定义事件失败,求排查代码问题

Dart无法捕获自定义"test"事件的问题排查与修复

原代码展示

HTML代码

<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="scaffolded-by" content="https://github.com/dart-lang/sdk">
    <title>quickstart</title>
    <link rel="stylesheet" href="styles.css">
    <script defer src="allEvents.js"></script>
    <script defer src="main.dart.js"></script>
</head>

<body>
<button onclick="myFunction()">Click me</button>
</body>
</html>

allEvents.js代码

function myFunction() {
  console.log("from event");
  var event = new CustomEvent("test", { "detail": "Example of an event" });
  window.document.dispatchEvent(event);
}

Dart main方法代码

import 'dart:html' as html;

void main() {
  print("from  main");
  html.window.onMessage.listen((html.MessageEvent event) {
    print("hello dart");
  });
}

问题原因

你的代码存在两处核心不匹配:

  • 事件类型不匹配:JS中触发的是自定义test事件,但Dart监听的是onMessage(对应浏览器原生message事件,仅用于postMessage跨上下文通信),二者完全无关。
  • 事件监听对象不匹配:JS在document对象上触发事件,但Dart监听的是window对象,自定义事件默认不冒泡,无法从document传递到window。

修复方案

修改Dart代码,改为在document对象上监听自定义test事件:

import 'dart:html' as html;

void main() {
  print("from  main");
  // 监听document上的test自定义事件
  html.document.addEventListener('test', (html.Event event) {
    // 转换为CustomEvent获取携带的detail内容
    if (event is html.CustomEvent) {
      print("hello dart, event detail: ${event.detail}");
    } else {
      print("hello dart");
    }
  });
}

或者使用事件流语法:

import 'dart:html' as html;

void main() {
  print("from  main");
  html.document.on['test'].listen((html.Event event) {
    if (event is html.CustomEvent) {
      print("hello dart, event detail: ${event.detail}");
    } else {
      print("hello dart");
    }
  });
}

修改后点击按钮,即可在控制台看到Dart输出的预期日志。


内容的提问来源于stack exchange,提问作者focode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:35:23