unhead@betaQuick Answer: Use onload and onerror attributes in your useHead() script tags. For advanced event handling, use useScript() with onLoaded() and onError() callbacks. For window/document events, use bodyAttrs with event handlers like onresize or ononline.
Unhead provides support for native DOM event handling, allowing you to attach event listeners to document elements through head management. This feature enables you to execute code in response to various browser events like window resizing, navigation changes, or print events.
useScript() composable.For non-script resources like stylesheets, Unhead supports standard HTTP-related events. Use onload to detect when a stylesheet has finished loading, and onerror to handle failures.
import { useHead } from '@unhead/solid-js'
if (import.meta.client) {
useHead({
link: [
{
rel: 'stylesheet',
href: '/assets/critical.css',
onload: () => {
console.log('Critical CSS loaded')
// Load non-critical resources
loadDeferredResources()
},
onerror: () => {
console.error('Failed to load stylesheet - using fallback styles')
applyFallbackStyles()
}
}
]
})
}
if (import.meta.client) conditionals to ensure they work correctly with SSR.Unhead allows you to attach event handlers to the document body through the bodyAttrs property. These events effectively let you respond to document and window-level events.
window object for better browser compatibility.These events are only supported with bodyAttrs and provide access to various browser lifecycle events:
import { useHead } from '@unhead/solid-js'
// Types for body event handlers
interface BodyEvents {
// Printing events
onafterprint?: string | ((el: Element) => void) // After print dialog closes
onbeforeprint?: string | ((el: Element) => void) // Before print dialog opens
// Page lifecycle events
onbeforeunload?: string | ((el: Element) => void) // Before page is unloaded
onload?: string | ((el: Element) => void) // Page finished loading
onunload?: string | ((el: Element) => void) // Page is being unloaded
// Navigation events
onhashchange?: string | ((el: Element) => void) // URL hash has changed
onpagehide?: string | ((el: Element) => void) // User navigates away
onpageshow?: string | ((el: Element) => void) // User navigates to page
onpopstate?: string | ((el: Element) => void) // Window history changes
// Connection events
onoffline?: string | ((el: Element) => void) // Browser goes offline
ononline?: string | ((el: Element) => void) // Browser goes online
// Other events
onerror?: string | ((el: Element) => void) // Error occurs
onmessage?: string | ((el: Element) => void) // Message is received
onresize?: string | ((el: Element) => void) // Window is resized
onstorage?: string | ((el: Element) => void) // Web Storage is updated
}
if (import.meta.client) conditionals to ensure they work properly with server-side rendering.Track window size changes and update application state:
import { useHead } from '@unhead/solid-js'
if (import.meta.client) {
useHead({
bodyAttrs: {
onresize: (e) => {
console.log('Window resized', e)
// Update responsive state, recalculate layouts, etc.
}
}
})
}
Measure and report page load performance metrics:
import { useHead } from '@unhead/solid-js'
if (import.meta.client) {
useHead({
bodyAttrs: {
onload: () => {
// Report page load timing data
if (window.performance) {
const perfData = window.performance.timing
const pageLoadTime = perfData.loadEventEnd - perfData.navigationStart
console.log(`Page loaded in ${pageLoadTime}ms`)
// Send to analytics
if (window.analytics) {
window.analytics.track('Page Load Time', {
milliseconds: pageLoadTime
})
}
}
}
}
})
}
Notify users when they lose internet connection:
import { useHead } from '@unhead/solid-js'
if (import.meta.client) {
useHead({
bodyAttrs: {
onoffline: () => {
// Show offline notification
showNotification('You are currently offline. Some features may be unavailable.')
},
ononline: () => {
// Show back online notification
showNotification('You are back online!')
// Resync data if needed
syncData()
}
}
})
}
if (import.meta.client) when working with event handlers to ensure proper hydrationif (import.meta.client) {
useHead({
bodyAttrs: {
onresize: () => handleResize()
}
}) // Critical for event handlers
}
// Good: Lightweight handler that delegates complex logic
if (import.meta.client) {
useHead({
bodyAttrs: {
onresize: () => requestAnimationFrame(recalculateLayout)
}
})
}
useScript() for script-related events rather than direct script event handlers// Prefer this approach for scripts
useScript({
src: 'https://example.com/analytics.js',
onLoaded: api => api.initialize()
})
if (import.meta.client) {
useHead({
bodyAttrs: {
onload: () => {
const observer = new ResizeObserver(handleResize)
observer.observe(document.body)
// Store cleanup function for framework to use
return () => observer.disconnect()
}
}
})
}
| Scenario | Recommended Approach |
|---|---|
| Script loading and interaction | useScript() |
| Window resize handling | DOM events with bodyAttrs |
| Page lifecycle events | DOM events with bodyAttrs |
| Print events | DOM events with bodyAttrs |
| Stylesheet loading | DOM events with link tags |
| Online/offline detection | DOM events with bodyAttrs |
onload and onerror attributes for script eventsuseScript() for advanced script event handling