Не удается запустить `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)

И дает интересный результат

Как видите, JSVals верны, и мы можем запустить команду в консоли 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

0 ответов

Другие вопросы по тегам