Elm端口在Firefox中不工作

Elm端口在Firefox中不工作,firefox,elm,Firefox,Elm,我在让Elm端口与Firefox一起工作时遇到问题 这是我的index.html: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Firefox Ports</title>

我在让Elm端口与Firefox一起工作时遇到问题

这是我的
index.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Firefox Ports</title>
</head>

<body>
    <script src="/app.js"></script>
</body>

</html>
这是我的
Main.elm

port module Main exposing (main)

import Html exposing (Html, div, text)


type Msg
    = None


type alias Model =
    {}


initialModel : Model
initialModel =
    {}


init : ( Model, Cmd Msg )
init =
    ( initialModel, sayHello "Foo" )


port sayHello : String -> Cmd msg


main : Program Never Model Msg
main =
    Html.program
        { init = init
        , update = update
        , subscriptions = subscriptions
        , view = view
        }


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    ( model, Cmd.none )


subscriptions : Model -> Sub Msg
subscriptions model =
    Sub.none


view : Model -> Html Msg
view model =
    div []
        [ text "Hello" ]
在chrome控制台中,输出显示在初始化模型时调用端口函数(
init
):

清楚地显示端口函数已被调用,但在Firefox中,最后一行(
问候语,Foo
)缺失:

here
window.onload

我做错了什么?

您可以尝试将
subscribe()
调用移动到
fullscreen()

const app = Elm.Main.fullscreen();
app.ports.sayHello.subscribe(function(who) {
    console.log("Greetings,", who);
});
console.log("here");

window.onload = function() {
    console.log("window.onload");
};

我的直觉是Firefox中的事件周期在
window.onload
之前运行Elm代码,而当时该端口没有订阅。这只是一种预感,但我认为最佳实践要求您在创建应用程序时立即设置订阅。

如果在
全屏()调用之后移动
subscribe()
调用会发生什么?(在记录
“here”
)之前,它可以工作,因此问题不应该出在端口上。实际上,我从一个更大的程序中简化了这一点,该程序试图控制一个使用Google dialog polyfill的模态对话框。我还需要再调查一次。@ChadGilbert它在Firefox中工作,包括对话框polyfill。不确定为什么
窗口。onload
出现问题。如果你把你的评论转换成回答,我会接受的。谢谢。我还添加了一个端口,用
dialogPolyfill
注册每个对话框,它可以正常工作,但我将尝试将该部分移动到
窗口中。onload
函数可以自动注册带有标记
dialog
的所有元素。
here
window.onload
const app = Elm.Main.fullscreen();
app.ports.sayHello.subscribe(function(who) {
    console.log("Greetings,", who);
});
console.log("here");

window.onload = function() {
    console.log("window.onload");
};