ServiceNow

ServiceNow中的Client-side APIs的g_form 底层是如何实现的?

前言🔖


ServiceNow 里有非常非常多不同的客户端 API(Client-side APIs)

你可以去 developer.servicenow.com(ServiceNow 开发者官网) 查看所有可用的 API,

在那里你能找到 GlideFormGlideUserg_scratchpad 等所有客户端类的详细文档。

系统里有几十种不同的客户端类(大概 20-30 个左右),每个类下面又有大量方法

我刚接触 ServiceNow JavaScript 时,曾在开发者门户打开 GlideForm 的文档,

最常用的几个

  • GlideFormg_form
  • GlideUserg_user
  • Glide Scratchpad

接下来我们先深入讲解 GlideForm:它的作用是:提供一系列方法,用于自定义表单、管理表单字段与数据。比如你看到的这个例子:表单顶部的蓝色提示条(INFO message),就是用 g_form.addInfoMessage 方法创建的。

GlideForm = ServiceNow 表单端的「万能操作 API」,对象名就是 g_form。

  • GlideForm类名g_form全局实例名
  • 你在脚本里写的 g_form,本质就是 GlideForm 的实例

你写的所有表单端脚本(onChange/onLoad/onSubmit,包括目录客户端脚本),

90% 的操作全靠 g_form 完成

  

🔹为什么 GlideForm 是最核心的客户端 API?

  • 所有表单端的交互,全靠 g_form 控制
  • 变量联动、自动填充、字段隐藏、实时校验、提示信息,全是 g_form 的活
  • 目录客户端脚本、普通客户端脚本,g_form 用法完全一致,逻辑可复用

  

🔹关键注意事项

  • g_form 只在表单端生效

    • g_form 是表单端 API,列表端 onCellEdit 不能用
    • 列表端只能用 alert 做提示,不能用 g_form.addInfoMessage

  

g_form底层是如何实现的?🔖


g_form 它本质就是:浏览器里的一个【JavaScript 对象】

当你打开一个 ServiceNow 表单时,系统会在你的浏览器内存里自动创建一个 全局 JS 对象,名字就叫:

g_form

它的类型是:

GlideForm

它就活在你的浏览器里,不在服务器!

  

底层实现分 4 层

🔹1. 第一层:浏览器加载表单 → 生成 DOM

ServiceNow 表单在浏览器里就是:

HTML
DIV
INPUT
SELECT
各种标签

这些叫 DOM(文档对象模型),g_form 操作的就是这些 DOM 元素

  

🔹2. 第二层:ServiceNow 前端框架创建 g_form 对象

表单加载时,ServiceNow 前端引擎做了一件事:

var g_form = new GlideForm( formId, tableName, sysId );

这个对象里保存了:

表名
字段名
当前记录 sys_id
所有字段的 DOM 元素位置
字段值
字段状态(显示 / 隐藏 / 必填)

  

🔹3. 第三层:g_form 方法 = 封装好的 DOM 操作

g_form.setValue('department', '123');

底层真实做的事:

  • 根据字段名 department 找到对应的 <input> 标签
  • 执行原生 JS:
document.getElementById('department').value = '123';
  • 同时更新 g_form 内部缓存的值
  • 触发字段变更事件

  

🔹4. 第四层:与服务器通信(AJAX)

有些 g_form 方法会发异步请求:

save()
refresh()
getReference()

底层就是:

XMLHttpRequest / fetch

发送 AJAX 请求到后台,获取数据再回填到表单。

  

g_form = 浏览器里的 “表单管家”

它知道:
每个字段在哪里
每个字段当前值是什么
怎么改显示 / 隐藏
怎么改必填
怎么发请求保存
你不用写原生 DOM,
g_form 帮你包好了

  

g_form 底层完整执行流程🔖


g_form.setValue('department', g_user.userID);

底层真实步骤:

1.g_form 检查字段是否存在
2.找到该字段对应的 DOM <input>
3.修改 DOM 的 value
4.更新 g_form 内部缓存
5.触发 onChange 事件
6.更新页面显示

  

g_form 底层技术栈🔖


  • 原生 JavaScript
  • DOM 操作
  • AJAX(异步请求)
  • 事件监听(onChange、onLoad)
  • ServiceNow 自定义前端框架(Glide UI)

  

g_form 为什么只能在表单用?🔖


g_form 对象只有在【表单页面】才会被创建!

列表页面(List)

没有 g_form

→ 所以 onCellEdit 不能用 g_form

目录表单(Catalog Item)

有 g_form

→ 所以 Catalog Client Script 能用 g_form