【问题标题】:Execute only parts of code that is injected as a string仅执行作为字符串注入的部分代码
【发布时间】:2020-04-08 13:54:19
【问题描述】:

我正在使用 Blockly,下面的代码通过字符串变量注入到文档中。字符串(代码)是自动生成的:

var cv; //global variable will execute since used inside onGreenFlagClicked

// will get execute
function helloWorld() {
  MinecraftAvatar.waveHelloForNSeconds(7)
}

function onGreenFlagClicked() {
  cv = helloWorld();
  MinecraftAvatar.sayForNSeconds("I am Mike", 7)

};

Players.walkForwardForNSeconds(7) // no execution
MinecraftAvatar.waveHelloForNSeconds(7) // no execution

在上面的字符串(代码)中,我想在脚本附加到 DOM 时执行onGreenFlagClicked()。我的问题是我只想执行部分代码,例如:变量、函数定义,而不是上面显示的其他内容。

我想禁用

Players.walkForwardForNSeconds(7) // no execution
MinecraftAvatar.waveHelloForNSeconds(7) // no execution

...当代码附加到 DOM 时。

这有可能吗?

【问题讨论】:

  • 将整个内容包装在一个 IIFE 中,该 IIFE 采用您要执行的函数名称数组。然后迭代该数组以从内部调用函数。
  • 如果你不想在脚本加载时执行Players.walkForwardForNSeconds(7),那为什么会出现呢? 什么时候你想让它执行呢?
  • 我正在使用 google blockly ,所以当我拖动一个块时,代码会自动生成,孩子也可以这样做,所以我想避免这种情况
  • 这个信息应该在问题中。目前在您的问题中没有说明此代码实际上是 注入 到文档中并来自其他地方(块状)。为了正确理解问题,这似乎是关键信息......
  • 好的,我会补充的

标签: javascript reactjs algorithm performance dom


【解决方案1】:

如果您不想执行以下操作:

Players.walkForwardForNSeconds(7) // no execution 
MinecraftAvatar.waveHelloForNSeconds(7) // no execution

...那么您需要删除这些行。

使用代码来操作字符串并不好,但您可以例如删除最后一次出现 } 之后的所有代码,如下所示:

code = code.replace(/[^}]*$/, ""); 

或者,您可以删除所有以大写字母开头的行(前面没有空格):

code = code.replace(/^[A-Z].*/gm, ""); 

添加一个调用,你可以追加到代码中:

code = code + "\nonGreenFlagClicked();";

【讨论】:

  • appendScript({ text: code }, aframeWindow.document, () => { aframeWindow.onGreenFlagClicked(); }) 我正在附加代码,但你告诉我通过解析删除这两行(可能是正则表达式?)因为我也会有 var somethingonGreenFlagClicked() 之外的全局范围内,如果 var 在绿旗函数内,我需要将其与这两行一起过滤。有人说我应该把我的代码放在 IIFE 中并将函数作为参数传递并循环执行该函数,有什么更好的?
  • code变量不是你创建的吗?如果不是,那么这会带来安全风险:您为什么要信任 code
  • 嘿,我已经更新了问题,它是由块生成的
  • 嘿,你能支持这个问题吗,我知道为什么,但他们说要改进现有问题以提出一个新问题,请帮忙,我保证我会让我的问题更清楚,@trincot
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
相关资源
最近更新 更多