0

私の現在の jQuery Mobile アプリケーションでは、さまざまな HTML 要素でクリック イベントをトラップし、次を使用して要素の data-* 属性のセット全体を抽出します。

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

すべてをJSON文字列にパッケージ化

var json = JSON.stringify(data);

ダウンストリーム処理のために別の場所に送信します。

私が遭遇した問題 (そして、それは jQuery Mobile の最近のバージョンでのみ始まったと確信しています) は、data() 配列の一部として匿名機能を持つラジオ、チェックボックス、ボタンなどのいくつかの要素にあります。そのような関数のシリアライズは

  • 私のアプリケーションとは関係ありません
  • さらに重要なことに、「無効になったオブジェクトを使用しようとしました」という行に沿って JavaScript をトリガーします...

いくつかの実験のおかげで、問題は raw data() オブジェクトで現れる匿名関数に関係していることがわかった

  1. ボタン要素
  2. モバイルチェックボックスラジオ

次に、これらの問題のあるエンティティがないシリアル化する独自のオブジェクトを作成します。

これは問題ありませんが、別の問題が見つかりました。jQM バージョンと BOOM を変更すると、属性名が変更されたため、問題が再び発生します (たとえば、mobile-checkboxradio の代わりに mobileCheckboxRadio を使用)。

質問 - より一般的で、属性名にとらわれない、これらの不快なビットを取り除く方法を提案できる人はいますか? 私が得るものは常に文字列であるため、私自身の努力とオブジェクト属性の typeof を理解しようとする試みは失敗しました。その文字列の「匿名関数」というフレーズをいつでもチェックできると思いますが、それは不器用に聞こえます。

4

1 に答える 1

0

これを行う方法を考え出しました。次のことができます

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

これは、ラジオボタンで何が起こるかを示すフィドルです。お気づきのように、返される data-* 属性のうち 2 つはオブジェクトです。それらの 1 つ、mobileCheckboxradio は無名関数です。データをそのままシリアル化しようとすると、トラップされて報告される例外が発生します。anon関数を取り除いた安全にクローンされたオブジェクトでは、すべてうまくいきます。

これには、「バージョンプルーフ」であるという利点があります。このようなエラーを引き起こしやすい少数の属性を単にチェックするよりも優れているかどうかは、議論の余地があります。

于 2013-10-07T12:50:31.367 に答える