安全 getElementById 或尝试确定 GUI 中是否存在 ID

2023-12-02

Method UiInstance.getElementById(ID)总是返回GenericWidget对象,即使 ID 不存在。

有什么方法可以找出我的应用程序中不存在返回的对象,或者检查 UI 是否包含具有给定 ID 的对象?


使用 GUI 生成器创建 UI 的解决方案:

function getSafeElement(app, txtID) {
    var elem = app.getElementById(txtID);
    var bExists = elem != null && Object.keys(elem).length < 100;
    return bExists ? elem : null;
}

如果ID不存在则返回null。我没有测试所有小部件的键长度边界,因此请小心并使用 GUI 进行测试。

编辑:此解决方案仅适用于doGet()功能。它在服务器处理程序中不起作用,因此在这种情况下将其与 @corey-g 答案结合使用。


这仅适用于您创建小部件的同一执行,而不适用于您检索小部件的后续事件处理程序,因为在这种情况下,无论是否存在,所有内容都是 GenericWidget。

您可以亲眼看到该解决方案失败了:

function doGet() {
  var app = UiApp.createApplication();
  app.add(app.createButton().setId("control").addClickHandler(
      app.createServerHandler("clicked")));
  app.add(app.createLabel(exists(app)));
  return app;
}

function clicked() {
  var app = UiApp.getActiveApplication();
  app.add(app.createLabel(exists(app)));
  return app;
}

function exists(app) {
  var control = app.getElementById("control");
  return control != null && Object.keys(control).length < 100;
}

应用程序将首先打印“true”,但在单击处理程序上,它将为同一小部件​​打印“false”。

这是设计使然; GenericWidget 是一种指向浏览器中小部件的“指针”。我们不会跟踪您创建的小部件,以减少浏览器和脚本之间的数据传输和延迟(否则我们必须发送每个事件处理程序上存在的小部件的长列表)。您应该跟踪您创建的内容,并且只“询问”您已经知道存在的小部件(并且您已经知道其“真实”类型)。

如果您确实想跟踪存在哪些小部件,您有两个主要选择。第一个是在创建小部件时将条目记录到 ScriptDb 中,然后再查找它们。像这样的事情:

function doGet() {
  var app = UiApp.createApplication();
  var db = ScriptDb.getMyDb();
  // You'd need to clear out old entries here... ignoring that for now
  app.add(app.createButton().setId('foo')
      .addClickHandler(app.createServerHandler("clicked")));
  db.save({id: 'foo', type: 'button'});
  app.add(app.createButton().setId('bar'));
  db.save({id: 'bar', type: 'button'});
  return app
}

然后在处理程序中您可以查找那里有什么:

function clicked() {
  var db = ScriptDb.getMyDb();
  var widgets = db.query({}); // all widgets
  var button = db.query({type: 'button'}); // all buttons
  var foo = db.query({id: 'foo'}); // widget with id foo
}

或者,您可以通过使用标签纯粹在 UiApp 中执行此操作

function doGet() {
  var app = UiApp.createApplication();
  var root = app.createFlowPanel();  // need a root panel
  // tag just needs to exist; value is irrelevant.
  var button1 = app.createButton().setId('button1').setTag(""); 
  var button2 = app.createButton().setId('button2').setTag("");
  // Add root as a callback element to any server handler
  // that needs to know if widgets exist
  button1.addClickHandler(app.createServerHandler("clicked")
      .addCallbackElement(root));
  root.add(button1).add(button2);
  app.add(root);
  return app;
}

function clicked(e) {
  throw "\n" +
      "button1 " + (e.parameter["button1_tag"] === "") + "\n" + 
      "button2 " + (e.parameter["button2_tag"] === "") + "\n" + 
      "button3 " + (e.parameter["button3_tag"] === "");
}

这会抛出:

button1 true
button2 true
button3 false

因为按钮 1 和 2 存在,但 3 不存在。您可以通过将类型存储在标签中来变得更有趣,但这足以检查小部件是否存在。它之所以有效,是因为根的所有子元素都被添加为回调元素,并且所有回调元素的标签都随处理程序一起发送。请注意,这听起来很昂贵,并且对于具有大量小部件的应用程序来说可能会影响性能,尽管在许多情况下可能没问题,特别是如果您仅将根作为回调元素添加到实际需要验证的处理程序中任意小部件的存在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安全 getElementById 或尝试确定 GUI 中是否存在 ID 的相关文章

  • 用于向日历活动提交表单的 Google 脚本

    学校老师使用我的个人 Google 帐户创建表单并将日历发布到我的班级网站 努力让孩子 无法访问 Google Apps 尽可能快速 轻松地安排补考使用这种形式 https docs google com forms d 1 TvsZ3Wl
  • 如何在表单提交时运行 Appscript?

    我正在尝试创建当用户完成表单提交时重定向到网络应用程序的 Google 表单 我查过谷歌开发者文档 https developers google com apps script guides triggers 但我看不到一种简单的方法来做
  • 为什么电子邮件正文给出不同的输出?

    我正在尝试触发来自 Google 应用程序脚本的电子邮件 const body HtmlService createHtmlOutput A b new task b have been added to the Task Manager
  • 正则表达式 - 使用正则表达式提取电子邮件文档的子字符串

    我正在尝试使用正则表达式提取电子邮件文档的子字符串 我正在在线测试正则表达式 它运行得很好 在线正则表达式测试器 https regex101 com r BbWBPk 1 我有一个功能可以检查 Google Apps 脚本上的正则表达式
  • 如何下载以前保存的 Google Apps 脚本修订版本?

    我仍在尝试从中恢复不知何故 丢失 了 Google Apps 脚本 https stackoverflow com questions 33697789 当我创建脚本的副本以将代码分叉到另一个项目时 我的想法是尝试通过驱动器 API 下载
  • 电子表格的 Google 脚本(If 语句)

    我希望有人能帮助我解决这个问题 我是编码新手 我有一个谷歌电子表格 其中有一个可以推送电子邮件的脚本 我试图让脚本忽略脚本已发送电子邮件的行 function onOpen var ui SpreadsheetApp getUi Or Do
  • 如果您有多个表单向单个电子表格发送响应,Google 如何知道提交表单时要执行哪个 onsubmit 触发器

    我需要有人澄清 据我了解 多个表单可以将其回复发送到新 Google 表格中的单个电子表格 因此 我创建了两个 Google 表单 并让他们都将回复发送到新的 Google 电子表格 然后我在电子表格 而不是表单 中创建了两个脚本 每个脚本
  • Clasp 无法创建新的 Apps 脚本

    我用这个终端命令克隆了一个应用程序脚本 clasp clone
  • 如何使用 google Sheet 作为数据库

    如何在 HTML Web 应用程序中生成 Google 工作表数据 并允许用户从 HTML Web 应用程序更新评论 我在谷歌表中有一些数据 通过谷歌表单提交 我想使用搜索按钮根据 请求编号 从网络应用程序搜索工作表数据 应该能够更新网络应
  • 仅生成一张电子表格的 PDF

    我需要一个只用一张电子表格创建 PDF 的脚本 我目前有一个生成 PDF 的脚本 但它处理整个文件 我无法将这些值复制到另一个文件 因为我需要导出的工作表是带有从另一个工作表中提取的数据的图形 你可以帮帮我吗 谢谢 function myF
  • Firebase GAS webapp Google 弹出窗口消失

    我正在尝试升级我的 firebase GAS web 应用程序 之前我有一个弹出窗口 可以让用户使用 Google 登录 我不确定我做错了什么 但我已经升级到新的 firebase 现在正在尝试使用新的代码格式进行相同的登录 发生的情况是
  • 如何设置多个过滤器?

    我有一个关于将过滤器应用于多个值以使用 Google 脚本隐藏它们的问题 我有一个具有多种状态的项目跟踪器 例如 达到目标 已完成 已取消 已延迟 等 我想编写一个脚本来设置 状态 列的筛选器值 以便标记为 已完成 或 的行 已取消 被隐藏
  • 如何使用 Google 脚本将数据添加到 Google 表格中的特定行

    在我的 Google 表格中 我将索引放在名为 colorRow 的变量中 我只是想向工作表中的该行添加一些数据 但数据不断进入页面下方的其他行 我究竟做错了什么 var data Some more fields in data arra
  • 如何从 Google Apps 脚本小工具重定向到另一个网页?

    我正在 Google 协作平台中构建一个网络应用程序 目前 我有两个表单 第一个表单加载电子表格并将其显示为表格 然后当您从表中选择一行时 脚本会使用 GET 请求和一些参数调用另一个 Web 应用程序 如 rowIndex X colum
  • Google 表格脚本 - onEdit 和“源”

    我已经努力了几天 试图让脚本发挥作用 在最基本的层面上 我的函数包含以下内容 function onEdit e var changedRange e source getActiveRange 根据谷歌的文档 这似乎是完全合法的用途 ht
  • Session.getActiveUser.getEmail() 空白?谷歌表格

    我想检查点击该特定按钮的用户 当我以我的帐户登录时单击它时 它运行正常 但如果其他人运行它 它就是空白的 如何获取登录用户的电子邮件 ID 这是我的代码 function check User var ui SpreadsheetApp g
  • 在 Google 表单上,我可以在单选按钮上设置默认值吗?

    我想弄清楚是否可以将单选按钮选项之一设置为默认选项 但在 Google 表单上不可能吗 https www google com forms about https www google com forms about 即使使用 Googl
  • 使用 Google Apps 脚本在 Google 表单中的 multiplechoiceitem 中插入图像

    我需要在多项选择项的每个选项中插入 Google Drive 图像 在检查文档后 该类 addMultipleChoiceItem 不支持该方法 setImage 还有其他方法可以插入 Google Drive 中的图像吗 Example
  • 发送电子邮件的 Google Apps 脚本语法错误。无法识别我的问题

    我正在尝试让 Google 工作表从工作簿中另一张工作表的长列表中发送个性化电子邮件 我使用了教程 因为我是所有编码语言的认证新手 但 AppScript 告诉我第 4 行有语法错误 我一生都无法弄清楚我做错了什么 但我确信当由具有这些合法
  • Google Apps 脚本 oauth connect 不适用于 trello

    我一直在尝试使用 oAuth谷歌应用脚 本 https docs google com macros 访问 trello 数据 但 OAuthService API 似乎对 oAuth 服务做出了一些假设 并且 trello 无法以这种方式

随机推荐

  • 80286:乘以 10 最快的方法是什么?

    要将一个数字乘以 2 的任意倍数 我将对其进行多次移位 有没有这样的技术可以在更少的周期内将一个数字乘以 10 80286 没有随 80386 一起引入的桶形移位器 根据 Microsoft Macro Assembler 5 0 文档 1
  • 更改要在 R Shiny 中绘制的变量时,防止重置绘图选定的迹线

    我正在尝试制作一个闪亮的应用程序 它由侧边栏面板和绘图组成 在面板中 我使用单选按钮来选择应绘制哪个 ID 我还有多个变量 用户可以使用情节图例关闭和打开这些变量 我希望应用程序首次打开时绘图为空 为此 我正在使用visible legen
  • 使用值列表初始化模板数组

    在标准 C 中我们可以这样写 int myArray 5 12 54 95 1 56 我想用模板写同样的东西 Array
  • 从源代码动态创建编译的.NET exe?

    我需要将自定义的 唯一的静态字符串注入到基于 NET 的 EXE 中 出于所有意图和目的 假设这是我的 PKI 私钥 我对如何保护 C 源代码中的私钥有一些想法 我的问题是如何获取 CS 文件并基于它创建可执行文件 看一眼CSharpCod
  • 如何增加 Worklight Server 中的 Java 堆空间?

    尝试部署 Android 应用程序时 我在 Worklight 中收到 JVM 堆空间错误 Failed to deploy the application to Worklight server InputStream error jav
  • Sidekiq 在每个时区的特定时间执行

    使用Sidekiq 让它在每个时区的特定时间执行的策略是什么 例如 我需要 Sidekiq 每天在世界各地的以下时间和时区执行任务 8 00 PM EST 8 00 PM CST 8 00 PM MST 8 00 PM PST 我会在开始时
  • Ruby 文件读取并行性

    我有一个包含很多行的文件 比如 10 亿行 脚本会迭代所有这些行 将它们与另一个数据集进行比较 由于目前它在 1 个线程 1 个核心上运行 我想知道是否可以启动多个分支 每个分支同时处理文件的一部分 到目前为止我想到的唯一解决方案是sedU
  • 批处理文件删除除最新的 10 个文件之外的所有文件

    我在批处理文件中有以下内容 REMOLDFILES ECHO Removing files older than 14 days gt gt LOGFILE cd d BKUPDIR FOR f skip 14 delims A IN DI
  • 为什么 Chrome 中 onchange 先于 onclick 触发?

    我仍然会利用这个社区的专业知识和可用性 我的问题是 为什么如果我们有类似的代码
  • 如何从它所在的所有表中选择一个列?

    我有许多具有相同列 customer number 的表 我可以通过查询获取所有这些表的列表 SELECT table name FROM ALL TAB COLUMNS WHERE COLUMN NAME customer number
  • 编写 $.cookie 以在多表单页面提交时显示表单

    使用 cookie 编写一个页面 以便在多表单页面提交时显示表单 我看到类似的问题在涉及到这个特定代码时没有得到解答 我读了又读 似乎这应该可行 是的 jquery 很新 1 周 我有容器 div 类 每个容器都有一个 p 切换来显示 隐藏
  • 使用 for 表达式从可能为空的 JSON 值中提取选项

    我有一个 JSON 文档 其中某些值可以为空 在 json4s 中使用 for 表达式 我如何能够产生 None 而不是什么也不产生 当任一字段的值相同时 以下内容将无法产生FormattedID or PlanEstimate is nu
  • 升压::正则表达式_替换

    目前我在 boost regex 方面遇到问题 我需要找到合适的单词 替换 与相应的词 我的代码现在看起来像这样 std string name ptap std string name regex b name b boost regex
  • 如何使用 awk 重命名重复行?

    我有一个包含 100 万行的文件 其中一些行是重复的 我想通过附加 variant 一个数字来重命名重复的行 该文件的格式如下 I am a test line She is beautiful need for speed Nice da
  • java 类文件中的泛型类型存储在哪里?

    我很清楚 编译 Java 代码时泛型类型会被删除 1 5 JVM 使用哪些信息 属性 来实现getGenericType ETC 它们存储在Signature属性 参见第 4 8 8 节更新了 Java 虚拟机规范 以及第 4 4 4 节关
  • html中变量前面的点表示什么?

    总的来说 我对 html 和 web 编码很陌生 下面的代码中变量前面的句点表示什么 JS code Thanks 这些不是变量 这些是 CSS 选择器 它们代表每个示例中具有该类的 HTML 节点 div class page title
  • Python 变长嵌套循环

    我试图在 python 中嵌套一个可变长度的 for 循环 并且能够重用这些变量 for i in range 0 256 for j in range 0 256 for k in range 0 256 myvar i j k 在上面的
  • 删除id最大的地方

    我想删除 order id 最大的行 我尝试了以下方法 DELETE FROM orders WHERE MAX order id 但这是错误的 还有其他想法吗 感谢您的时间 第一个想法 以及许多其他完全相同的想法 DELETE FROM
  • UML 类图中的 Java 服务器页面 (.JSP) 文件

    我正在为即将开始的项目编写设计 我想知道应该如何在我创建的 UML 类图中表示视图 jsp 文件 由于 jsp 文件不是类 它们适合放在这里吗 我认为不会 因为这是一个类图 但我不确定我应该如何表示这些 有什么想法吗 JSP 文件被认为是视
  • 安全 getElementById 或尝试确定 GUI 中是否存在 ID

    Method UiInstance getElementById ID 总是返回GenericWidget对象 即使 ID 不存在 有什么方法可以找出我的应用程序中不存在返回的对象 或者检查 UI 是否包含具有给定 ID 的对象 使用 GU