【问题标题】:Loop over a function and store as list循环一个函数并存储为列表
【发布时间】:2022-01-26 17:54:41
【问题描述】:

我有以下功能可以单击带有启动画面的复选框:

local get_dimensions = splash:jsfunc([[
        function () {
            for i=1, 5 do
            var rect = document.querySelector(string.format('checkbox[number="%d"]'), i)
            .getClientRects()[0];
            return {[rect.left]: rect.top};
    end
        }
    ]])

但是,我不能将循环中的列表存储到像rect 这样的单个变量中,那么如何将列表存储到变量中,当我返回它时,它应该返回一个值列表?

类似python的东西,即:

def stuff():
    rect = []
    for i in range(5):
        rect.append([...])
    return rect

【问题讨论】:

  • 我无法跟随你。 “我无法将循环中的列表存储到像 rect 这样的单个变量中”是什么意思?为什么你不能?有什么错误吗?为什么只标记lua?你的问题不是在 JavaScript 中吗? Lua 部分看起来不错。我不是 JS 专家,但你的 for 循环看起来很像 Lua for 循环,而不像 JavaScript for 循环。这个函数需要一个 JavaScript 函数

标签: lua scrapy scrapy-splash


【解决方案1】:

让我们看看你的代码。

您致电splash:jsfunc。此函数将 JavaScript 转换为 Lua 可调用对象。它需要一个参数。定义 JavaScript 函数的字符串。

yourString = [[
  function () {
    for i=1, 5 do
      var rect = document.querySelector(string.format('checkbox[number="%d"]'), i).getClientRects()[0];
      return {[rect.left]: rect.top};
    end
  }
]]

这看起来像是 Lua 和 JavaScript 的某种奇怪组合。

这就是 JavaScript for 循环的样子

for (let i = 0; i < 10; i++) {
  // some code
}

这是 Lua 数字 for 循环的样子:

在没有任何条件的情况下在循环中使用 return 有什么意义?这将在 i = 1 的第一个循环之后执行。这可能不是您想要的。

所以修复循环,使它成为 JavaScript。创建一个对象或数组,并在循环完成后返回。

【讨论】:

  • 它来自这里的文档:splash.readthedocs.io/en/stable/scripting-ref.html,它提供了我使用的示例,但有我的修改。所以你是说function 中的代码是javascript?好的!我假设我必须在循环外创建一个空数组,并将循环内的值存储到数组中。然后返回循环外?另外,javascript中的string.format等价于什么?
  • 那么您的修改不正确。目前你有 JavaScript 和 Lua 的混合,其中 JavaScript 是预期的。如果要将 JavaScript 代码嵌入 Lua 脚本,则需要了解 Lua 和 JavaScript。请理解,我不会为您编写另一个 JavaScript 教程。网上的内容已经绰绰有余了。请在网上搜索资源。
  • 不,这很好 - 似乎没有相当于 string.format 的 JavaScript。
猜你喜欢
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 2018-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多