(设置!(.-onload图像)(fn []))不起作用 [英] (set! (.-onload image) (fn [] )) not working
问题描述
我有以下代码将一些图像作为输入,然后使用compress-omg函数对其进行压缩,该函数获取按顺序输入的每个图像的数据URL,并将压缩后的Blob存储在db向量中:images >
I have the following code which takes as input some images and then compresses them using the compress-omg function, which takes a data-url of each image inputted in sequence and stores the compressed blobs in a db vector :images
(defn image-selector []
[:<>
;; appending image in this div
[:div {:id "test-div"}]
[:input {:type "file"
:multiple true
:id "input-image"
:on-change
(fn [e]
(let [files (array-seq (.. e -target -files))]
(doseq [file files]
;; must create a new file-reader in each iteration
(let [file-reader (js/FileReader.)]
(set! (.-onload file-reader)
(fn [e]
(let [data-url (-> e .-target .-result)]
(dispatch [:images (compress-img data-url)]))))
(.readAsDataURL file-reader file)))))}]])
(defn compress-img [data-url]
"takes data-url. Compresses it and returns a blob."
(let [image (js/Image.)
canvas (js/document.createElement "canvas")
ctx (.getContext canvas "2d")
blob (js/Blob. [data-url])
window-url (or (-> js/window .-URL) (-> js/window .-webkitURL ))
blob-url (.createObjectURL window-url blob)
]
(set! (.-onload image)
;; doesn't print
(fn [_]
(prn "image height" (.-height image))
(prn "image width " (.-width image))
(set! (.-src image) blob-url)
(.appendChild (js/document.getElementById "test-div") image)
(.drawImage ctx image 0 0 (.-width image) (.-height image))
;; approximating sizes of compressed and uncompressed images
(prn "size original (MB)" (* 0.75 0.000001 (.-length data-url)))
(prn "size upload (MB)" (* 0.75 0.000001 (.-length (.toDataURL canvas "image/png" 0.1))))
;; compressing and returning the blob
(js/Blob. [(.toDataURL canvas "image/png" 0.1)])
)
)
(set! (.-onerror image)
;; doesn't print
(fn [e]
(prn "error is " e)
(prn "error")))
))
但是永远不会触发onload和onerror事件.我在做什么错了?
But the onload and onerror events are never triggered. What am I doing wrong?
推荐答案
在您的代码示例中,(set! (.-src image) blob-url)
滑入了onload
事件处理程序本身.
In your code example the (set! (.-src image) blob-url)
slipped into the onload
event handler itself.
您必须在该函数之外调用该函数以实际开始加载图像,以便它可以正确触发onload
.
You must call that outside that function to actually start loading the image so it can properly trigger the onload
.
类似
(set! (.-src image) blob-url)
(set! (.-onload image)
(fn [_]
(prn "image height" (.-height image))
(prn "image width " (.-width image))
(.appendChild (js/document.getElementById "test-div") image)
(.drawImage ctx image 0 0 (.-width image) (.-height image))
;; approximating sizes of compressed and uncompressed images
(prn "size original (MB)" (* 0.75 0.000001 (.-length data-url)))
(prn "size upload (MB)" (* 0.75 0.000001 (.-length (.toDataURL canvas "image/png" 0.1))))
;; compressing and returning the blob
(js/Blob. [(.toDataURL canvas "image/png" 0.1)])
))
这篇关于(设置!(.-onload图像)(fn []))不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!