前言🔖
ServiceNow 里有非常非常多不同的客户端 API(Client-side APIs)。
你可以去 developer.servicenow.com(ServiceNow 开发者官网) 查看所有可用的 API,
在那里你能找到 GlideForm、GlideUser、g_scratchpad 等所有客户端类的详细文档。
系统里有几十种不同的客户端类(大概 20-30 个左右),每个类下面又有大量方法。
我刚接触 ServiceNow JavaScript 时,曾在开发者门户打开 GlideForm 的文档,
最常用的几个:
GlideForm(g_form)GlideUser(g_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