Javascript 如何将变量用作js代码?
我试图使用jQuery(或highcharts)将数据添加到下面的函数中。问题是如何在不使用eval的情况下将数据嵌入到javascript代码中,因为我必须将所有代码都写成字符串Javascript 如何将变量用作js代码?,javascript,jquery,highcharts,Javascript,Jquery,Highcharts,我试图使用jQuery(或highcharts)将数据添加到下面的函数中。问题是如何在不使用eval的情况下将数据嵌入到javascript代码中,因为我必须将所有代码都写成字符串 function pie(data) { $(function () { $('#renderingdiv').highcharts({ chart: { plotBackgroundColor: null, plotBorderWidth:
function pie(data)
{
$(function () {
$('#renderingdiv').highcharts({
chart: {
plotBackgroundColor: null,
plotBorderWidth: null,
plotShadow: false
},
title: {
text: 'Browser market shares at a specific website, 2010'
},
tooltip: {
pointFormat: '{series.name}: <b>{point.percentage:.1f}%</b>'
},
plotOptions: {
pie: {
allowPointSelect: true,
cursor: 'pointer',
dataLabels: {
enabled: true,
color: '#000000',
connectorColor: '#000000',
format: '<b>{point.name}</b>: {point.percentage:.1f} %'
}
}
},
series: [**data**]
});
});
};
有什么想法吗?这个快速而肮脏的函数将您的数据转换为有效的JSON并返回一个对象
function parseData(data) {
data = data
// remove \+line endings
.replace(/\[\n\r]+/g, '')
// insert double quotes for keys
.replace(/([\[{,])\s*(\w+)([,:])/g, '$1"$2"$3')
// replace values single quotes with double
.replace(/(:)\s*'(\w+)\s*'/g, '$1"$2"');
return JSON.parse(data);
}
当然,您应该对此进行改进,以处理转角情况
演示:(导致控制台输出)
但这只是一个解决办法。真正的解决方案是更改服务器输出以返回有效的JSON
结果(JSON编码):
{“类型”:“pie”,“名称”:“状态”,“数据”:[[“WSCH”,377],“WMATL”,4],“WAPPR”,349],“NCOMP”,3],“INPRG”,56],“COMP”,18],“CLOSE”,697],“APPR”,420]}
有什么框架支持它吗?有什么理由不想使用eval()吗?只是出于好奇问一下数据应该是字符串吗?然后使用
JSON.parse
而不是eval
。如果不是,那么这些反斜杠在那里做什么?你一开始是怎么把它们弄到那里的?删除它们,您可以将标记用作JS对象文字。@john:是的,特殊框架。一般来说,问题是如何在不使用eval的情况下在代码中嵌入变量?@Raghu:eval并不可取,因为数据可能包含一些字符,而且需要大量编码才能使用\。是的,但我的问题不是转换为JSON。我需要上面显示的其他格式的数据。我想要一种机制,将数据字符串变量(可能包含一些js代码)添加到函数中,就像它是pie函数代码的一部分一样
function parseData(data) {
data = data
// remove \+line endings
.replace(/\[\n\r]+/g, '')
// insert double quotes for keys
.replace(/([\[{,])\s*(\w+)([,:])/g, '$1"$2"$3')
// replace values single quotes with double
.replace(/(:)\s*'(\w+)\s*'/g, '$1"$2"');
return JSON.parse(data);
}