The onScrollEnd event handler fires when the user finishes scrolling the JavaScript Scheduler grid.
Declaration
DayPilot.Scheduler.onScrollEnd(args)Parameters
args.control(DayPilot.Scheduler) - control instance (available since 2026.1.6836)args.viewport.start(DayPilot.Date) - read-only viewport start date/timeargs.viewport.end(DayPilot.Date) - read-only viewport end date/timeargs.viewport.resources(array of string | number) - read-only list of resource IDs currently visible in the viewport
Additional properties available when DayPilot.Scheduler.dynamicLoading is enabled:
args.async(boolean) - if set totrue, the Scheduler waits forargs.loaded()before updating; the default value istrueargs.events(array) - event data objects to load; each item uses the DayPilot.Event.data structureargs.remove(array of string | number) - events to remove; experimental, useargs.clearEvents = trueinsteadargs.clearEvents(boolean) - whether to clear existing events before loading the newargs.eventsdata; the default value istrueargs.loaded()- performs the asynchronous update
Notes
Available since version 2023.3.5731.
Since version 2026.1.6836, this event always fires after scrolling. In earlier versions, it was only fired when dynamic event loading was enabled.
This event is based on the native scrollend event and may not be supported in all browsers, including Safari.
When using dynamic event loading, the only supported actions inside
onScrollEndare settingargsproperties and callingargs.loaded(). Do not change Scheduler properties or call refresh methods such as update(), rows.filter(), or rows.load().Angular: Do not set the
[events]attribute when dynamic event loading is enabled. In combination withargs.clearEvents = false, it can cause an infinite loop.React: Do not set the
eventsprop when dynamic event loading is enabled, and do not save the events loaded inonScrollEndback to the wrappereventsprop. This can cause an infinite loop.
Examples
JavaScript
const dp = new DayPilot.Scheduler("dp", {
dynamicLoading: true,
onScrollEnd: async (args) => {
args.async = true;
const start = args.viewport.start;
const end = args.viewport.end;
const resources = args.viewport.resources.join(",");
const {data} = await DayPilot.Http.get(`/api/events?start=${start}&end=${end}&resources=${resources}`);
args.events = data;
args.loaded();
},
// ...
});
dp.init();Angular
<daypilot-scheduler [config]="config"></daypilot-scheduler>config: DayPilot.SchedulerConfig = {
dynamicLoading: true,
onScrollEnd: async (args) => {
args.async = true;
const start = args.viewport.start;
const end = args.viewport.end;
const resources = args.viewport.resources.join(",");
const {data} = await DayPilot.Http.get(`/api/events?start=${start}&end=${end}&resources=${resources}`);
args.events = data;
args.loaded();
},
// ...
};React
<DayPilotScheduler
dynamicLoading={true}
onScrollEnd={onScrollEnd}
{/* ... */}
/>const onScrollEnd = async (args) => {
args.async = true;
const start = args.viewport.start;
const end = args.viewport.end;
const resources = args.viewport.resources.join(",");
const {data} = await DayPilot.Http.get(`/api/events?start=${start}&end=${end}&resources=${resources}`);
args.events = data;
args.loaded();
};Vue
<DayPilotScheduler
:dynamicLoading="true"
@scrollEnd="onScrollEnd"
<!-- ... -->
/>const onScrollEnd = async (args) => {
args.async = true;
const start = args.viewport.start;
const end = args.viewport.end;
const resources = args.viewport.resources.join(",");
const {data} = await DayPilot.Http.get(`/api/events?start=${start}&end=${end}&resources=${resources}`);
args.events = data;
args.loaded();
};See Also
Dynamic Event Loading [doc.daypilot.org]
DayPilot.Scheduler.dynamicLoading
Availability
Availability of this API item in DayPilot editions:
| Product | Lite | Pro |
|---|---|---|
| DayPilot for JavaScript |
DayPilot