想在JavaScript中避免使用eval -

时间:2016-02-26 14:15:20

标签: javascript eval blockly

我正在使用JavaScript将字符串转换为Google Blockly块

输入字符串类似于"Hello %s World" - 其中%s定义字符串输入。我需要把它变成:

Blockly.Blocks['blockname'] = {
  init: function() {
    this.appendDummyInput()
        .appendField("Hello ")
        .appendField(new Blockly.FieldTextInput("input1"), "")
        .appendField(" World");
  }
};

但是我不确定如何在不使用eval()的情况下实现这一点,并且因为输入字符串来自用户,我知道使用eval()不是一个好主意。

我目前的代码是:

currentLine = blockText[x].split(/(%s)/);
for( var y = 0; y < currentLine.length; y++ )
{
  if( currentLine[y] == "" )
  {
    //do nothing
  }
  else if( currentLine[y] == "%s" )
  {
    //create a input
  }
  else
  {
    //create a label
  }
}

但是我不太确定如何创建我需要的Blockly代码,而不是在字符串中构建JavaScript然后在最后使用eval()。

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

您可以创建一个自定义通用块,而无需输入任何类似下面的内容-

  Blockly.Blocks['generic_block'] = {
    init: function() {
      this.jsonInit({
        message0: '',
        colour: '230'
      });
    }
  };

现在,您可以通过代码创建该块的新实例。根据您的JS字符串解析,您可以在此块内创建输入和字段,如下所示-

var lineBlock=yourBlocklyWorkspace.newBlock('generic_block');         // create new instance of generic block
var input=lineBlock.appendDummyInput();                               // create a dummy input
var blockText="Hello %s World";                                       // one line of the JS code
var currentLine = blockText.split(/(%s)/);                            // split every word
for( var y = 0; y < currentLine.length; y++ ) {                       // loop through each word
  if(currentLine[y]==='%s') {                                         // if the word is %s, then append input field
    input.appendField(new Blockly.FieldTextInput('input'+y));         // input+y is the name of the field
  } else {                                                                         // else just append label field
    var labelField=new Blockly.FieldLabel('label'+y);                         // label+y is the name of the field
    labelField.setValue(currentLine[y]);                                          // set the label value to the word
    input.appendField(labelField)
  }
}