Lazy Loading JavaScript with KnackInitAsync()
KnackInitAsync()
If you lazyload JavaScript with event handlers, you will need to wrap any event handlers within the KnackInitAsync()
function. This is a global function that Knack calls when it has completely loaded.
It also passes in the Knack jQuery object as the first parameter, $
. Knack uses a sandboxed jQuery object to prevent conflicts with other jQuery versions you may be using.
Example: External JavaScript File with an Event Handler
// file.js
$(document).on('knack-scene-render.any', function(event, scene) {
alert('Page rendered!');
});
Wrapping LazyLoad with KnackInitAsync()
KnackInitAsync()
Now let's load file.js
into our Knack app using LazyLoad.js
, wrapped in KnackInitAsync()
:
// Define `KnackInitAsync` globally
KnackInitAsync = function($, callback) {
// REQUIRED: Expose Knack's jQuery globally
window.$ = $;
// Load external JavaScript
LazyLoad.js(['https://example.com/javascript-files/file.js'], function () {
console.log('Loaded external files!');
// REQUIRED: Let Knack continue loading
callback();
});
};
Notes on KnackInitAsync()
KnackInitAsync()
- This function can only be defined once.
- If you are adding JavaScript directly in the Builder's custom code section, you do not need to wrap your handlers in this function — they are automatically called once Knack has loaded.