在我目前的jQuery Mobile应用程序中,我在各种HTML元素上捕获点击事件,使用
提取元素的整个data- *属性集。var data = $(element).data();
将它全部打包成JSON字符串
var json = JSON.stringify(data);
并将其发送到其他地方进行下游处理。
我遇到的问题(我很确定它只是从jQuery Mobile的最新版本开始)是一些元素,如无线电,复选框和按钮,它们具有匿名函数作为data()数组的一部分。序列化这些函数是
通过一些实验我发现问题与在原始data()对象中出现的匿名函数有关
等。然后我构建自己的对象序列化,没有这些违规的实体。
这没关系,但我发现了另一个问题。更改jQM版本和BOOM,由于属性名称已更改(例如mobileCheckboxRadio代替mobile-checkboxradio),问题再次出现。
问题 - 任何人都可以建议一个更通用的,属性名称不可知的,剥离这些令人反感的比特的方法吗?我自己的努力并试图弄清楚对象属性的类型已经失败,因为我得到的总是一个字符串。我想我总是可以检查该字符串中的短语“annonymous function”,但听起来很笨拙。
答案 0 :(得分:0)
我找到了一种方法来做到这一点。可以做以下事情
var data = $(element).data();
$.each(data,function(key,prop){if ('object' != typeof(prop)) /*do something */)}
这是一个fiddle,展示单选按钮会发生什么。正如您将注意到的,返回的两个data- *属性是对象。其中之一,mobileCheckboxradio是一个匿名函数。尝试按原样序列化数据,然后得到一个异常 - 被捕获并报告。使用安全克隆的对象,这是anon函数的剪切,一切顺利。
这有“版本证明”的好处。是否比仅仅检查可能导致此类错误的少数属性更好是值得商榷的。