Repository navigation
canvas.Image should call onload asynchronously when src is set #2264
Description
Activity
It's defined in C++:
Lines 92 to 93 in adf73ee
Nan::Set(info.This(), Nan::New("onload").ToLocalChecked(), Nan::Null()).Check(); Nan::Set(info.This(), Nan::New("onerror").ToLocalChecked(), Nan::Null()).Check(); node-canvas's
img.src=is sync right now though, so you need to setonloadbeforesrc. (#1710)That's not really in keeping with how it works in the browser though, so updating the JS side to make sure onload also gets called if it gets assigned after src has been assigned would be a good code update.
It's not ideal, but I don't think we can change anything in the current version without that being a breaking change.
Having
img.src=be async (as the browsers do it) is already planned for Canvas v3: #2232why would that be a breaking change? existing code will keep working the same way, and "the browsery way" currently doesn't work, so isn't being used.
onloadonly gets to trigger once per src assignment, so any code folks already wrote should be entirely unaffected.should being key here, e.g. this code snippet would have changed behaviour?
const img = new Image() img.src = 'a.png' img.onload = () => console.log('test') img.src = 'b.png'
Before this logged
testonce, but if we implement your suggested change as I've understood it, it would logtesttwice?That'd be odd code to have anywhere, but yes, that would break. Then again, that's why semver exists of course: just bump the major version so that npm and friends don't auto-uplift to a breaking change. There's nothing sacred about version numbers, they're just a versioning utility, the "it'd be a breaking change" argument is literally why semver exists. Unless #2232 is planned for soon, of course, but from the looks of it, it doesn't have a timeline and none of the tasks have been completed yet?
(Breaking changes should be fine, no matter how frequent, just bump the major version number each time you add one. Because the major version does not mean "a completely reworked release" when you're using semver. It just means "this is not backward compatible in one or more ways")
- changed the title
[-]canvas.Image lacks onload[/-][+]canvas.Image should call onload asynchronously when src is set[/+]on Aug 17, 2026
Issue or Feature
The
Imageimplementation lacks anonloadcall (at least based on https://github.com/Automattic/node-canvas/blob/master/lib/image.js), making it impossible to use it "the normal way" where the onload is our signal that image data is available and now we can do something with that data.(
onloadon the HTML side = incredibly bad, do not use.onloadon the JS side: unfortunately still extremely necessary forImage,WebSocket, etc. etc. it never went away in JS land and we kept reinforcing it by introducing new object types that kept theonloadandonerrorpattern firmly alive right up to today =S)Steps to Reproduce
The above code won't actually do anything for
node-canvas(but will run perfectly fine in the browser) because the shimmedImagehas no code to trigger theonload"callback".Suggested fix
Add an
onloadproperty with getter/setter:And update
setSourceto something like