Я писал ранее о том, как значения javascript взаимодействуют с Json.Decode здесь, но это осознание снова дало мне что-то новое. Прочитав комментарий от debois/elm-dom boundingClientRect, я задумался… могу ли я использовать тот же метод, что и раньше, чтобы добиться большего успеха?
Обработать результат getBoundingClientRect с помощью свойства в Node.prototype с небольшим количеством кода просто:
function getClientRectOfElement() { return this.getBoundingClientRect(); } Object.defineProperty(Node.prototype, ‘__arty__clientRect’, { get: getClientRectOfElement });
И
module Util exposing (..) import DOM import Json.Decode as JD exposing ((:=)) type alias Rectangle = DOM.Rectangle decodeRectangle : JD.Decoder Rectangle decodeRectangle = JD.object4 DOM.Rectangle (“top” := JD.float) (“left” := JD.float) (“width” := JD.float) (“height” := JD.float) clientRectangle : JD.Decoder Rectangle clientRectangle = JD.at [“__arty__clientRect”] decodeRectangle
И
import Util exposing (clientRectangle) ... view model = div [class "expand-animate", on “click” (DOM.target clientRectangle |> JD.map StartExpand] []
И
action: HomeMsg (StartExpand { top = 250.453125, left = 60.09375, width = 1097.796875, height = 128 }) index.js:901 r: { top = 250.453125, left = 60.09375, width = 1097.796875, height = 128 } index.js:901 action: HomeMsg (StartExpand { top = 180.453125, left = 60.09375, width = 1097.796875, height = 128 }) index.js:901 r: { top = 180.453125, left = 60.09375, width = 1097.796875, height = 128 }
Было бы неплохо, если бы elm был либо немного более снисходительным, либо остановился бы на способе идентификации и измерения элементов самостоятельно. До тех пор, небольшой хак может иметь большое значение :-)