On close inspection of Prototype JS, it extends the base Object object with a bind method. While my code uses the
jQuery().on() method to declare event handlers, we were utilizing a plugin that uses
jQuery().bind() instead. Adding breakpoints to this code made it obvious that for each scroll event that was fired, Prototype JS was hijacking the event, and running it through its processes instead of jQuery handling it, causing much more CPU usage than is normally expected.
Updating this plugin to use
appear, which means nothing in jQuery, suddenly triggers events that Prototype and Scriptaculous automatically bind to and execute code when they are fired.
Effectively, you should make sure you only use
jQuery().on() and always namespace your event names and variables.