0

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

var data = $(element).data();

将其全部打包成 JSON 字符串

var json = JSON.stringify(data);

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

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

  • 与我的申请无关
  • 更重要的是,它会触发一个类似于“尝试使用不再有效的对象”的 JavaScript ...

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

  1. 按钮元素
  2. 移动复选框收音机

等等。然后我构建自己的对象来序列化没有这些违规实体。

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

问题 - 任何人都可以提出一种更通用的、与属性名称无关的方法来去除这些令人反感的部分吗?我自己的努力和试图找出对象属性的 typeof 都失败了,因为我得到的总是一个字符串。我想我总是可以在那个字符串中检查“匿名函数”这个短语,但这听起来很笨拙。

4

1 回答 1

0

我想出了一个办法来做到这一点。可以执行以下操作

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

这是一个演示单选按钮会发生什么的小提琴。您将注意到返回的两个 data-* 属性是对象。其中之一,mobileCheckboxradio 是一个匿名函数。尝试按原样序列化数据,你会得到一个异常——被捕获和报告。使用安全克隆的对象,它被取消了匿名函数,一切顺利。

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

于 2013-10-07T12:50:31.367 回答