Не удается запустить `dispatchEvent` в GHCJS
Цель - получить window.addEventListener("popstate", ...
для запуска из события, отправленного из кода GHCJS.
Пробовал до сих пор
GHCJS.DOM не работает
w <- currentWindowUnchecked
e <- newPopStateEvent "popstate" Nothing
dispatchEvent_ w e
Language.Javascript.JSaddle не работает
e <- newPopStateEvent "popstate" Nothing
jsg "window" ^. jsf "dispatchEvent" (toJSVal e)
FFI не работает
foreign import javascript unsafe "window.dispatchEvent($1)" dispatchIt :: JSVal -> JSM ()
e <- newPopStateEvent "popstate" Nothing
dispatchIt =<< toJSVal e
Вывод отладки
Это действительно работает:
e <- newPopStateEvent "popstate" Nothing
w <- currentWindowUnchecked
jsg "console" ^. js2 "log" (toJSVal e) (toJSVal w)
И дает интересный результат
Как видите, JSVal
s верны, и мы можем запустить команду в консоли JavaScript.
Последняя попытка
Затем я обнаружил, что если сразу после dispatchEvent
, он срабатывает.
foreign import javascript unsafe "window.foo()" foo :: JSM ()
w <- currentWindowUnchecked
e <- newPopStateEvent "popstate" Nothing
dispatchEvent_ w e
liftJSM foo
Это приводит к ожидаемому результату с dispatchEvent_
, но, очевидно, этого не произойдет, так как это вызывает ошибку времени выполнения.
Поэтому я подумал, что это может быть syncPoint
Все еще нет кубиков
!e <- newPopStateEvent ("popstate" :: Text) Nothing
!() <- dispatchEvent_ w e
liftJSM GHCJS.DOM.syncPoint
Запустите код
Вы можете попробовать это сами
git clone -b crud-example https://gitlab.com/fresheyeball/Shpadoinkle.git
cd Shpadoinkle
./examples/servant-crud/run-crud.sh
открыто localhost:8080
в браузере и щелкните слово "ECHO"
.
Соответствующий код:
https://gitlab.com/fresheyeball/Shpadoinkle/blob/crud-example/router/Shpadoinkle/Router.hs https://gitlab.com/fresheyeball/Shpadoinkle/blob/crud-example/examples/servant-crud/View.hs