Генерация функции из строки в Javascript - PullRequest
2 голосов
/ 09 ноября 2010

Я использую 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+='}}';
});

В первом разделе создается двумерный массив, который связывает массив наблюдений с их результирующим выводом по их индексу.Таким образом, что-то, что зарабатывает $ 10 (например, Meeting), будет сохранено в case [10] (Meeting = case [10] [0]).

Вторая часть записывает строку, которая делает оператор put в операторе switch.это выглядит примерно так:

function(x){    
    switch(x){
        case "Meeting":
            $("input[name^='earn']").val(10);
            break;
        case "Event1":
        case "Event2":
            $("input[name^='earn']").val(20);
            break;
    }
}

Обратите внимание, что синтаксис для случаев переключения приводит к тому, что Event1 и Event2 имеют одинаковый результат.

Теперь autoearn - это просто строка, содержащая код дляФункция, которую я хочу.Как превратить в функцию?Есть лучший способ сделать это?Я подумываю отправить его через PHP, чтобы вернуть его обратно в jQuery, но все это кажется действительно косвенным, и, вероятно, есть более простой способ сделать это.

Ответы [ 2 ]

5 голосов
/ 09 ноября 2010

Прежде всего, убедитесь, что код в строке является доверенным, иначе вы столкнетесь с проблемами при выполнении произвольного кода.

Вы можете создать функцию из строки следующим образом:

var f = new Function('arg1', 'arg2', ..., 'function code');

Вышеуказанное эквивалентно:

function f(arg1, arg2, ...) {
  function code
}

В вашем случае вы хотели бы удалить function(x) и открывающие / закрывающие скобки из строки autoearn и создать такую ​​функцию:

new Function('x', autoearn)
1 голос
/ 09 ноября 2010

Вот небольшой фрагмент кода, чтобы взять скрипт из строки и выполнить его:

  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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...