Gridstack.js предоставляет развитую систему событий, которая позволяет отслеживать изменения состояния сетки и элементов, происходящие как в результате действий пользователя, так и программных операций. Глобальные события сетки работают на уровне всей сетки и позволяют реагировать на добавление, перемещение, изменение размеров или удаление виджетов.
Для работы с глобальными событиями используется метод on
или стандартный addEventListener. Основной объект событий —
экземпляр Gridstack, создаваемый через
GridStack.init():
const grid = GridStack.init({ /* настройки */ });
Регистрация события осуществляется следующим образом:
grid.on('change', function(event, items) {
console.log('Произошли изменения в сетке', items);
});
Gridstack.js выделяет несколько ключевых событий, каждое из которых передает набор данных, отражающих текущее состояние виджетов.
added Срабатывает при добавлении новых виджетов в сетку. Аргументы:
event — объект события DOM.items — массив объектов, описывающих добавленные
виджеты (x, y, width, height, id).Пример:
grid.on('added', (event, items) => {
items.forEach(item => console.log('Добавлен виджет:', item.id));
});removed Срабатывает при удалении виджетов.
Структура аргументов идентична added.
grid.on('removed', (event, items) => {
console.log('Удалены виджеты:', items.map(i => i.id));
});change Основное событие для отслеживания всех изменений: перемещения и изменения размеров. Аргументы:
items — массив объектов с текущими координатами и
размерами каждого изменившегося виджета.grid.on('change', (event, items) => {
items.forEach(i => console.log(`Виджет ${i.id} перемещен в (${i.x}, ${i.y})`));
});dragstart / dragstop Срабатывают при начале и окончании перетаскивания виджета. Полезны для реализации динамической визуальной обратной связи.
grid.on('dragstart', (event, el) => console.log('Начало перетаскивания', el.id));
grid.on('dragstop', (event, el) => console.log('Окончание перетаскивания', el.id));resizestart / resizestop События начала и окончания изменения размеров виджета. Используются для обновления данных в реальном времени или подгонки интерфейса.
grid.on('resizestop', (event, el) => {
const node = grid.getNode(el);
console.log(`Виджет ${el.id} теперь ${node.w}x${node.h}`);
});Каждый элемент массива items или объект
node содержит свойства:
Для событий drag и resize дополнительно
доступны данные о смещении (dx, dy) и текущей
позиции в пикселях (offsetX, offsetY), что
позволяет реализовать сложные анимации и ограничения перемещений.
Gridstack позволяет работать с несколькими сетками на одной странице. В этом случае глобальные события можно фильтровать по экземпляру сетки:
const grid1 = GridStack.init({ container: '#grid1' });
const grid2 = GridStack.init({ container: '#grid2' });
grid1.on('change', (event, items) => console.log('Сетка 1 изменилась'));
grid2.on('change', (event, items) => console.log('Сетка 2 изменилась'));
Для некоторых событий можно предотвратить стандартные действия Gridstack, например, при динамическом ограничении перемещений:
grid.on('change', (event, items) => {
items.forEach(node => {
if(node.x > 5) node.x = 5;
});
});
Gridstack.js поддерживает сериализацию состояния сетки, что позволяет интегрировать глобальные события с сохранением данных:
grid.on('change', () => {
const serialized = grid.save();
localStorage.setItem('grid-state', JSON.stringify(serialized));
});
При инициализации сетки сохраненное состояние можно восстановить:
const saved = JSON.parse(localStorage.getItem('grid-state') || '[]');
GridStack.init({ /* настройки */ }).load(saved);
Глобальные события позволяют синхронизировать сетку с внешними источниками данных, например, серверными API:
grid.on('added', (event, items) => {
fetch('/api/widgets/add', {
method: 'POST',
body: JSON.stringify(items)
});
});
change для любых операций с координатами и
размерами, а added/removed — только для
контроля добавления и удаления виджетов.el перед
манипуляциями.Глобальные события Gridstack.js обеспечивают полное управление состоянием сетки и позволяют создавать динамичные, интерактивные интерфейсы с высокой степенью контроля над поведением виджетов.