2

ハイチャート プロジェクトに問題があり、チャート オプションがデータベースに保存されています。次のコードを使用してチャートに印刷しています。サンプルコードを使用して問題を説明しましょう。

echo 'var options69 = '.$highcharts_json_options;
echo PHP_EOL;
echo 'var options69_func = '. json_encode( $functions);
echo PHP_EOL;

echo '$(document).ready(function() {';
echo PHP_EOL;
echo '      chart69 = new Highcharts.Chart( 
                $.extend(true, options69, options69_func) 
            );';
echo PHP_EOL;
echo '});';

この問題は$functions、正しい JavaScript オブジェクトに変換されません。これは $functions のコードの例です

$functions = array(
    'chart' => array(
        'events' => array(
            'click' => "function(){inboxMenu(this.options);}"
        )

    ),
    'tooltip' => array(
        'formatter' => "function(){
            return '<b>'+ this.series.name + ':</b>'+ this.y;
        }"
    )
);

現在、 json_encode( $functions)出力は

var options69_func = {
    "chart": {
        "events": {
            "click": "function(){inboxMenu(this.options);}"
        }
    },
    "tooltip": {
        "formatter": "function(){return '<b>'+ this.series.name + ':<\/b>'+ this.y;}"
    }
}

しかし、私は値var options69_funcが必要です

var options69_func = {
    "chart": {
        "events": {
            "click": function(){
                inboxMenu(this.options);
             }
        }
    },
    "tooltip": {
        "formatter": function(){
            return '<b>'+ this.series.name + ':<\/b>'+ this.y;
        }
    }
}

次に、チャートclick eventまたはformatter 作品のみ..これらの値は、サーバーデータベースから動的に取得されます。にコールバック関数を追加できますjson_encodeか?

PHPで生成されたjsコードをhttp://jsfiddle.net/u9W6X/に追加しました

クライアント側で eval 関数を使用したくない..

4

2 に答える 2

0

JSON をサニタイズする方法の例を次に示します。 http://jsfiddle.net/zUEsF/1/

var obj = {
"chart": {
    "events": {
        "click": "(function(){inboxMenu(this.options);})"
    }
},
"tooltip": {
    "formatter": "(function(){return '<b>'+ this.series.name + ':<\/b>'+ this.y;})"
}
};

function update( el ) {
var out = {};
$.each(el, function(k, o) {
    if ( (typeof el[k]) === 'object' ) {
        out[k] = update( el[k] );
    } else if ( ( typeof eval(el[k]) ) === 'function' ) {
        out[k] = eval( el[k] );
    } else {
        out[k] = el[k];
    }
});
return out;
};

()ただし、無名関数をsでラップする必要があります。

于 2013-05-03T09:43:28.417 に答える
0

options69_func を取得した後、関数「クリック」を実行したい場合は、これを試すことができます: eval('('+options69_func.tooltip.click+')'+'();');

于 2013-05-03T09:24:42.503 に答える