我在highcharts项目上有一个问题,图表选项保存在数据库中。我使用以下代码在图表上打印。让我用一些示例代码来解释我的问题。
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函数。客户端
得到options69_func后,如果要执行"click"函数,你可以试试这个:eval (' (' + options69_func.tooltip.click +')'+'();');
下面是一个如何清理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包装匿名函数