Gridstack.js предоставляет мощный механизм событийного взаимодействия, позволяющий отслеживать изменения сетки и отдельных виджетов. События делятся на несколько категорий: события изменения размера, перемещения, добавления и удаления элементов, а также внутренние события самой сетки.
added — возникает при добавлении
нового виджета в сетку. Срабатывает после того, как элемент был вставлен
и размещён в DOM.removed — вызывается при удалении
виджета из сетки. Используется для освобождения ресурсов и очистки
данных, связанных с элементом.change — срабатывает при любом
изменении положения или размеров виджета. В обработчик передается массив
объектов с параметрами x, y,
width, height и id
элементов.dragstart, drag,
dragstop — события перетаскивания: начало, процесс
и завершение перемещения. Позволяют реализовать динамическое
отслеживание позиции элемента во время взаимодействия пользователя.resizestart, resize,
resizestop — события изменения размеров виджета,
аналогичные событиям перетаскивания, но для контроля размеров.Для отслеживания событий используется стандартный синтаксис
EventEmitter. С помощью метода on можно
привязать функцию-обработчик к конкретному событию:
const grid = GridStack.init();
grid.on('added', function(event, items) {
console.log('Добавлены новые элементы:', items);
});
grid.on('change', function(event, items) {
items.forEach(item => {
console.log(`Элемент ${item.id} перемещён в (${item.x}, ${item.y}) с размером ${item.width}x${item.height}`);
});
});
Параметры обработчика:
event — объект события DOM.items — массив объектов, содержащих данные изменённых
виджетов.Для отдельных элементов можно использовать jQuery-подобный подход, если Gridstack инициализирован с поддержкой jQuery:
$('.grid-stack').on('dragstop', '.grid-stack-item', function(event, ui) {
console.log('Перетаскивание завершено для элемента:', this.id);
});
Для полноценного логирования рекомендуется сохранять информацию о событиях в массив или объект. Например, для отслеживания истории перемещений и изменений размеров:
let changeLog = [];
grid.on('change', function(event, items) {
items.forEach(item => {
changeLog.push({
id: item.id,
x: item.x,
y: item.y,
width: item.width,
height: item.height,
timestamp: Date.now()
});
});
});
console.table(changeLog);
Такой подход позволяет реализовать откат изменений, анализ активности пользователя и сохранение состояния сетки на сервер.
Gridstack позволяет отслеживать не только конечные
изменения, но и промежуточные шаги перемещения и изменения
размеров. Использование событий drag и resize
подходит для динамических интерфейсов с анимацией и подсказками.
Пример:
grid.on('drag', function(event, ui) {
console.log(`Элемент ${ui.id} перемещается: (${ui.x}, ${ui.y})`);
});
grid.on('resize', function(event, ui) {
console.log(`Элемент ${ui.id} изменяет размер: ${ui.width}x${ui.height}`);
});
Для крупных приложений можно связать события Gridstack с серверной системой логирования или аналитикой. Это достигается через вызов API в обработчиках событий:
grid.on('added', function(event, items) {
items.forEach(item => {
fetch('/api/log', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({action: 'added', id: item.id, time: Date.now()})
});
});
});
Такой подход обеспечивает централизованное хранение информации о состоянии сетки и позволяет проводить аналитику действий пользователей.
Gridstack.js допускает использование собственных функций для перехвата событий перед их окончательной обработкой. Это позволяет фильтровать события, блокировать нежелательные перемещения или изменения размеров:
grid.on('change', function(event, items) {
items.forEach(item => {
if(item.width > 6) {
item.width = 6; // Ограничение максимальной ширины
}
});
});
Такой подход особенно полезен при создании динамических дашбордов с ограничениями на размеры и расположение виджетов.
Важно различать:
added,
removed, change) срабатывают для всех
элементов одновременно.dragstart, dragstop,
resizestart, resizestop) позволяют
обрабатывать действия пользователя на конкретном виджете.Комбинация этих уровней дает полное покрытие всех изменений и позволяет построить надежный механизм логирования и аналитики.
drag и resize, так как они вызываются
многократно при каждом изменении позиции или размера.dragstop
или resizestop).Для анализа текущего состояния сетки можно использовать метод
save:
let serialized = grid.save(); // Массив объектов {x, y, width, height, id}
console.log(serialized);
Эта информация может использоваться совместно с событиями для построения полной истории изменений и восстановления сетки в любой момент времени.
Эта система событий и логирования обеспечивает гибкий контроль над всеми действиями пользователя и позволяет строить сложные, интерактивные интерфейсы с Gridstack.js.