You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Gridster.js中为序列化参数添加自定义数据属性?

解决Gridster.js序列化自定义属性的问题

我看你遇到的问题是自定义的owner和company属性没法在序列化时被正确读取,这主要是两个原因导致的:一是你每次调用addWidget都重新初始化Gridster,会干扰内部状态;二是Gridster的wgd对象默认不包含你自定义的data属性,得从DOM元素里直接读取。

下面是具体的修复步骤和代码:

1. 提前初始化Gridster,避免重复初始化

把Gridster的初始化代码移到addWidget函数外面,页面加载完成后只初始化一次,这样能保证Gridster的状态稳定:

// 页面加载完成后初始化Gridster
$(function() {
  $(".gridster ul").gridster({ 
    widget_margins : [ 10, 10 ], 
    widget_base_dimensions : [ 140, 140 ], 
    serialize_params : function($w, wgd) { 
      return { 
        id : $w.attr('id'), 
        col : wgd.col, 
        row : wgd.row, 
        size_x : wgd.size_x, 
        size_y : wgd.size_y, 
        classes : $w.attr('class'), 
        styles : $w.attr('style'), 
        // 直接从DOM元素的data属性读取自定义值
        owner : $w.data('owner'), 
        company : $w.data('company') 
      }; 
    } 
  });
});

2. 修改addWidget函数,正确添加并序列化自定义属性

调整addWidget函数,直接获取已初始化的Gridster实例,并且优化widget的HTML结构(把点击事件绑定移到外面,避免重复绑定):

function addWidget() { 
  // 获取已初始化的Gridster实例
  var gridster = $(".gridster ul").data('gridster'); 
  
  // 构建widget的HTML,注意这里可以不用写data-row/data-col,add_widget会自动处理位置
  var widgetHtml = '<li class="orange" data-owner="omertasci" data-company="XYZ">' + 
    '<i class="fa fa-times"></i>' + 
    '<h1 style="padding-top: 0em ! important;">New Widget</h1>' + 
    '</li>'; 
  
  // 调用add_widget,参数是HTML、size_x、size_y,Gridster会自动分配位置
  gridster.add_widget(widgetHtml, 2, 1); 
  
  // 现在序列化就能拿到自定义属性了
  var serializedGridster = gridster.serialize(); 
  console.log(serializedGridster);
}

// 统一绑定删除事件,不要放在widget的script里
$(function() {
  $(document).on("click", ".fa-times", function() { 
    var indexOfLi = $(this).parent().index(); 
    removeWidget(indexOfLi);
  });
});

为什么之前的代码不行?

  • 重复初始化Gridster:每次调用addWidget都重新初始化,会覆盖之前的实例状态,导致序列化时无法正确读取最新的widget数据。
  • 错误从wgd读取自定义属性:wgd是Gridster内部维护的widget数据对象,只包含它默认跟踪的属性(比如col、row、size_x等),你自定义的data-owner和data-company并没有被自动存入wgd,所以必须从DOM元素$w通过data()方法读取。

现在你再运行代码,序列化结果里应该就能看到owner和company属性了,类似这样:

{
  classes:"orange gs-w", 
  col:5, 
  id:undefined, 
  row:1, 
  size_x:2, 
  size_y:1, 
  styles:"display: list-item; opacity: 0;",
  owner:"omertasci",
  company:"XYZ"
}

内容的提问来源于stack exchange,提问作者ÖMER TAŞCI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:16:23