Почему мой излучатель работает только в одном направлении? - PullRequest
0 голосов
/ 02 августа 2020

Я использую EventEmitter через тег сценария CDN. Я пытаюсь выполнить передачу между внешним сценарием и локальным сценарием, содержащимся в теге сценария HTML. Отправка из внешнего скрипта работает нормально. Но передача из тега сценария документа HTML не выполняется.

Что мне не хватает?

HTML документ:

<!DOCTYPE html>
<html>
  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/EventEmitter/5.2.8/EventEmitter.min.js"></script>
    <script src="emitter.js"></script>
  </head>
  <body></body>
  <script>
      e.on("fromJSFile", function(msg){
          console.log("Received message from external script: " + msg)
      })
      e.emit("fromHTMLScript", "Emitted from HTML script")
  </script>
</html>

Внешний сценарий (эмиттер. js):

let e = new EventEmitter()

e.emit("fromJSFile", "Emitted from external script")
e.on("fromHTMLScript", function(msg){
    console.log("Recieved message from HTML script: " + msg)
})

1 Ответ

2 голосов
/ 02 августа 2020

Он работает в обоих направлениях, но вам нужно подождать, пока будут установлены слушатели перед отправкой.

Браузеры выполнят JavaScript, как только он будет проанализирован, поэтому будет выполнено следующее ( в хронологическом порядке):

let e = new EventEmitter()

e.emit("fromJSFile", "Emitted from external script") // An event will be emitted on "fromJSFile", but there are no listeners at the execution time
e.on("fromHTMLScript", function(msg){
  console.log("Recieved message from HTML script: " + msg)
}) // Adding a listener on "fromHTMLScript"


e.on("fromJSFile", function(msg){
  console.log("Received message from external script: " + msg)
}) // Adding a listener on "fromJSFile"
e.emit("fromHTMLScript", "Emitted from HTML script") // An event is emitted on "fromHTMLScript" and caught by the listener

Что вам нужно сделать, так это настроить слушателей как можно скорее (вы можете настроить его даже до полной загрузки страницы), а затем передать с страница полностью загружена.

Например, вы можете записать это в своем JS файле:

let e = new EventEmitter()

e.on("fromHTMLScript", (msg) => {
  console.log("Recieved message from HTML script: " + msg)
}) // Register listener on "fromHTMLScript"

document.addEventListener("DOMContentLoaded", () => {
  e.emit("fromJSFile", "Emitted from external script")
}); // Emit on "fromJSFile" when the page fully loaded

И это в теге вашего скрипта:

e.on("fromJSFile", function(msg){
  console.log("Received message from external script: " + msg)
}) // Register listener on "fromJSFile"

document.addEventListener("DOMContentLoaded", () => {
  e.emit("fromHTMLScript", "Emitted from HTML script")
}); // Emit on "fromHTMLScript" when the page fully loaded
...