1

data 属性に JSON 文字列が格納されています。

{
    "active": true,
    "icons": {
        "activeHeader": "ui-icon-alert"
    },
    "animate": {
        "duration": 1000,
        "always": dMethod
    }
}

そして、dMethodという名前の関数があります:

function dMethod() {
  alert("DONE");
} 

文字列を解析しようとすると、JSON.parse無効な文字というエラーが表示されます。parse メソッドの実行時に dMethod が定義されていることを確認し、「always」:dMethod 部分を削除すると、パーサーは正しく機能しました。dMethod を引用符で囲むことはできません。型がオブジェクト関数ではなく文字列型になるためです。
どんな助けでも大歓迎です。
ありがとう、
ピーター
編集:
すべての回答に感謝します。問題をよりよく理解できるように、いくつか説明します。jqueryui を邪魔にならないようにするために、非常に単純な js ライブラリを作成します。

var juiObjects = ["accordion", "autocomplete", "button", "datepicker", "dialog", "menu", "progressbar", "slider", "spinner", "tabs", "tooltip"];

$(document).ready(function() {
  for (var i = 0; i < juiObjects.length; i++) {
    var attributeName = "data-" + juiObjects[i];
    $("["+ attributeName + "]").each(function () {
      var optionsValue = $(this).attr(attributeName);
      var options = JSON.parse(optionsValue);
      $(this)[juiObjects[i]](options);
    });
  }
});

JSON.parse と eval のどちらかを選択する必要がありました。しかし、evalはあまり良い選択ではないと思います。そして、「ライブラリ」をできるだけシンプルに保つようにしてください。しかし、ウィジェットに沿ってコードをspareteしたようです。

4

5 に答える 5

1

JSON.parseは有効な JSON 文字列を想定しています。したがって、それを使用する場合は、dMethod 関数を引用する必要があります。文字列「dMethod」を解析後に実際の関数に置き換えることはできませんか。

于 2013-08-12T10:30:52.620 に答える
0

これは、オブジェクトをその関数でシリアル化する方法です。

   JSON.stringify(YOUR_OBJECT, function (key, value) {
        if (typeof value === 'function') {
            return value.toString();
        }
        return value;
    });

これを逆シリアル化する方法は次のとおりです。

JSON.parse(YOUR_JSON_STRING, function (key, value) {
     if (value 
         && typeof value === "string" 
         && value.substr(0,8) == "function") {
         var startBody = value.indexOf('{') + 1;
         var endBody = value.lastIndexOf('}');
         var startArgs = value.indexOf('(') + 1;
         var endArgs = value.indexOf(')');

         return new Function(value.substring(startArgs, endArgs)
                           , value.substring(startBody, endBody));
     }
     return value;
 });
于 2016-07-27T22:46:47.603 に答える