Advanced Interface Development with jQuery UI 1.10
jQuery UI extends the core jQuery library, providing a suite of interactive widgets and interaction helpers designed to enhance web application user interfaces. Built on strict coding conventions and current JavaScript design best practices, it offers a consistent programming model for building rich interfaces.
Library Acquisition and Environment Setup
Development requires jQuery 1.6 or higher; jQuery 2.0.3 is suitable for modern implementations. For legacy Internet Explorer 6 support, version 1.9.2 of the UI library paired with jQuery 1.10 is necessary.
The library can be obtained via the download builder at the official project site, allowing developers to select specific components and themes to minimize file size. Alternatively, Content Delivery Networks (CDNs) hosted by Google, Microsoft, or the jQuery Foundation offer reliable access for production environments, reducing latency for international users.
Local Directory Structure
When unpacking the development bundle, the following structure is typical:
- css/: Contains minified production stylesheets organized by theme.
- js/: Holds minified library scripts.
- development-bundle/: Includes uncompressed source files, documentation, demos, and external tools like QUnit for testing.
- index.html: A local demo page showcasing available widgets.
For development purposes, referencing files within the development-bundle allows for easier debugging due to uncompressed code. Production deployments should utilize the minified files found in the root css and js directories.
The CSS Framework and Theming
The visual layer is managed by a modular CSS framework. Themes can be generated visualy using ThemeRoller or customized manually. The framework separates structural CSS from thematic styling.
Core Style Files
jquery.ui.core.css: Provides helper classes like.ui-helper-clearfixand.ui-helper-hidden.jquery.ui.theme.css: Contains visual definitions (colors, images, fonts) generated by ThemeRoller.jquery.ui.[widget].css: Specific layout rules for individual components.
In a development setting, linking jquery.ui.all.css imports all necessary dependencies. For production, a single merged minified file reduces HTTP requests.
Utilizing Framework Classes
Developers can apply framework classes to custom HTML elements to maintain visual consistency without initializing full widgets. Common containers include:
.ui-widget: The outer wrapper..ui-widget-header: Styled header sections..ui-widget-content: Main content areas..ui-state-default,.ui-state-hover,.ui-state-active: Interaction states.
Icons are implemented via CSS sprites. A span with class .ui-icon combined with a specific icon class (e.g., .ui-icon-circle-plus) renders the graphic. Custom icons can be integrated by overriding the background-image property in a custom stylesheet.
Overriding Themes
To customize beyond ThemeRoller capabilities, create a separate stylesheet linked after the theme file. Use specific selectors to override properties. For example, modifying border radius or background colors requires matching or exceeding the specificity of the original theme selectors.
Position Utility
The position utility allows elements to be aligned relative to other elements, the window, or the mouse cursor without requiring the core UI dependency. Its configured via an options object passed to the .position() method.
Key configuration options include:
my: Defines which edge of the positioned element to align (e.g., "left top").at: Defines which edge of the target element to align against.of: Specifies the target element (selector, jQuery object, or event).collision: Determines behavior when the element exceeds the viewport ("flip", "fit", or "none").
Implementation Example
The following script aligns a notification box to the bottom-right of a trigger element:
$(function() {
$(".notification-box").position({
my: "right bottom",
at: "right bottom",
of: ".trigger-element",
collision: "fit"
});
});
The using callback allows for custom logic during positioning, receiving calculated top and left coordinates as arguments.
Working with the Tabs Widget
The tabs widget organizes content into collapsible panels, accessible via clickable headers. It requires a specific HTML structure: a container holding a list of links (<ul>, <li>, <a>) and corresponding content panels identified by fragment identifiers.
Basic Initialization
<div id="navContainer">
<ul>
<li><a href="#section-1">Overview</a></li>
<li><a href="#section-2">Details</a></li>
</ul>
<div id="section-1">Content for the first panel.</div>
<div id="section-2">Content for the second panel.</div>
</div>
$(function() {
$("#navContainer").tabs();
});
Configuration Options
Behavior is modified through an options object passed during initialization:
active: Index of the initially open panel (zero-based).collapsible: Allows all panels to be closed.disabled: Array of indices to disable initially.event: The DOM event that triggers tab switching (default is "click").show/hide: Effects used when transitioning between panels.
To open the second panel by default with a fade effect:
const widgetConfig = {
active: 1,
show: { effect: "fade", duration: 400 }
};
$("#navContainer").tabs(widgetConfig);
Event Handling
Widgets trigger custom events that can be intercepted. The beforeActivate event occurs prior to switching panels and can be canceled to prevent the change.
$("#navContainer").on("tabsbeforeactivate", function(event, ui) {
if (!validateContent()) {
event.preventDefault();
}
});
Callbacks can also be defined directly in the configuration object. The event object and a UI object containing newTab and oldTab properties are passed to the handler.
Programmatic Control
Methods allow dynamic manipulation of the widget after initialization. Methods are invoked by passing the method name as a string to the plugin function.
disable: Deactivates the widget or specific tabs.enable: Reactivates the widget.refresh: Updates the DOM structure after adding/removing tabs manually.destroy: Removes the widget functionality entirely, reverting to raw HTML.
To enable a specific tab index programmatically:
$("#navContainer").tabs("enable", 1);
To retrieve the currently active tab index:
const currentIndex = $("#navContainer").tabs("option", "active");
AJAX and Remote Content
Tabs can load content dynamically from external sources. Setting the href attribute of a tab link to a remote URL causes the content to be fetched via AJAX when selected.
<li><a href="data/remote-content.html">Remote Data</a></li>
The load method forces a refresh of AJAX content, while the url method changes the source URL of a specific tab. For cross-domain requests, JSONP can be utilized within the event handlers to fetch data and inject it into the panel manually.
$("#navContainer").on("tabsbeforeactivate", function(event, ui) {
if (ui.newTab.index() === 2) {
$.getJSON("https://api.example.com/data", function(response) {
ui.newPanel.html(renderTemplate(response));
});
}
});