我正在使用jQuery从xml文件中获取数据并将其保存为字符串。字符串是一个switch语句,我想成为一个函数。
$.get('type.xml', function(xml) {
var cases=[];
$(xml).find('type').each(function(){
index=parseInt($(this).find('earn').text());
if($.isArray(cases[index])){
cases[index].push($(this).find('name').text());
}else{
arr=$.makeArray($(this).find('name').text());
cases[index]=arr;
}
});
var autoearn="function(x){switch(x){";
for(i=0;i<=100;i+=5){
if($.isArray(cases[i])){
$.each(cases[i], function(index,v){
autoearn+='case "'+v+'":';
});
autoearn+='$("input[name^=\'earn\']").val('+i+');break;';
}}
autoearn+='}}';
});
第一部分创建一个2D数组,通过索引将一组案例与其结果输出相关联。因此,收入10美元(例如会议)的东西将被存储在案例[10]中(会议=案例[10] [0])。
第二部分写了一个字符串,它将一个put放入一个看起来像这样的开关语句:
function(x){
switch(x){
case "Meeting":
$("input[name^='earn']").val(10);
break;
case "Event1":
case "Event2":
$("input[name^='earn']").val(20);
break;
}
}
请注意,switch case的语法使Event1和Event2具有相同的结果。
现在autoearn只是一个包含我想要的函数代码的字符串。怎么做成功能?有一个更好的方法吗?我正在考虑通过PHP发送它以将其返回给jQuery,但这整个事情似乎是间接的,并且可能有一种更简单的方法来执行此操作。
答案 0 :(得分:5)
首先,确保字符串中的代码是可信的,否则您将通过执行任意代码遇到问题。
您可以按字符串创建函数,如下所示:
var f = new Function('arg1', 'arg2', ..., 'function code');
以上相当于:
function f(arg1, arg2, ...) {
function code
}
在您的情况下,您需要从function(x)
字符串中删除autoearn
和左/右括号并创建如下函数:
new Function('x', autoearn)
答案 1 :(得分:1)
这是从字符串中获取脚本并执行它的一小段代码:
function loadScript(script) {
var func = null;
if (script) {
try {
func = new Function(script);
} catch (eParse) {
console.error("Error parsing script.");
console.debug(" error : %o", eParse);
console.debug(" script: %s", script);
}
}
if (func) {
try {
func(); // beware of scoping here, you might want to call this differently
} catch (eExec) {
console.error("Error running code.");
console.debug(" error : %o", eExec);
}
}
}
请注意:使用new Function
基本上与使用eval
语句一样危险。确保您收到script
参数的内容。