jQuery data()JSON编码问题

时间:2013-10-07 07:22:10

标签: jquery jquery-mobile

在我目前的jQuery Mobile应用程序中,我在各种HTML元素上捕获点击事件,使用

提取元素的整个data- *属性集。
var data = $(element).data();

将它全部打包成JSON字符串

var json = JSON.stringify(data);

并将其发送到其他地方进行下游处理。

我遇到的问题(我很确定它只是从jQuery Mobile的最新版本开始)是一些元素,如无线电,复选框和按钮,它们具有匿名函数作为data()数组的一部分。序列化这些函数是

  • 不相关我的申请
  • 更重要的是,按照“尝试使用不再有效的对象”的方式触发JavaScript ......

通过一些实验我发现问题与在原始data()对象中出现的匿名函数有关

  1. buttonElements
  2. 移动checkboxradio
  3. 等。然后我构建自己的对象序列化,没有这些违规的实体。

    这没关系,但我发现了另一个问题。更改jQM版本和BOOM,由于属性名称已更改(例如mobileCheckboxRadio代替mobile-checkboxradio),问题再次出现。

    问题 - 任何人都可以建议一个更通用的,属性名称不可知的,剥离这些令人反感的比特的方法吗?我自己的努力并试图弄清楚对象属性的类型已经失败,因为我得到的总是一个字符串。我想我总是可以检查该字符串中的短语“annonymous function”,但听起来很笨拙。

1 个答案:

答案 0 :(得分:0)

我找到了一种方法来做到这一点。可以做以下事情

var data = $(element).data();
$.each(data,function(key,prop){if ('object' != typeof(prop)) /*do something */)}

这是一个fiddle,展示单选按钮会发生什么。正如您将注意到的,返回的两个data- *属性是对象。其中之一,mobileCheckboxradio是一个匿名函数。尝试按原样序列化数据,然后得到一个异常 - 被捕获并报告。使用安全克隆的对象,这是anon函数的剪切,一切顺利。

这有“版本证明”的好处。是否比仅仅检查可能导致此类错误的少数属性更好是值得商榷的。