简介:这款泛微表单JS脚本大全面向需要深度定制流程表单的二次开发人员,整合了表单校验、控件联动、明细表操作、显隐控制、时间处理、水印提示及自定义事件等常见场景,可直接借鉴到实际项目中。资源整理为RAR压缩包,共111个文件,约990KB,以63个js脚本为核心,配有12个html演示页面、10个css样式表及若干txt说明文档,此外还包含少量jsp、字体图标和示例图片,便于按功能对照调试。已有2716人浏览学习。文件中通过按钮控制下拉框联动、获取系统时间提交、添加流程图到流程界面、展示图片信息等案例,系统覆盖了文本框验证、单选复选限制、明细行增删与合计、字段动态禁用、日期范围校验、提交前综合检查等逻辑。对于掌握JavaScript基础、希望提升泛微E-cology表单效率与数据质量的开发者,这份大全能提供较完整的脚本参考和排错思路,按需取用可加快开发进度。 你电脑里可能也躺着这样一份"泛微表单js大全.rar"——干过泛微二开的人,几乎都靠这类资料包起步。这种压缩包看着不起眼,里面却装满了很多人在表单引擎上攒下来的真实代码和处理经验。我手里这份是从几个版本的e-cology项目里一点点补全的,今天把它最核心的内容整理成文章:字段取值、流程ID获取、js宏写法、校验规则、常见报错,一次讲清楚。不管你是刚接触泛微表单二次开发的新手,还是被老旧表单和"祖传脚本"折腾得头疼的老手,这篇都能直接当速查手册用。
1. 开始写JS之前,先搞清泛微表单的运行机制
1.1 表单引擎里,JS到底长在哪儿
泛微OA的表单引擎,说白了就是一个从后台字段定义自动生成HTML页面的渲染器。你在表单设计器里拖一个文本框、一个下拉框,保存后系统会在前端生成对应的HTML控件。真正让表单"活"起来的JS,通常有三个存放位置。
第一是表单设计器里的JavaScript函数或事件配置处,这部分专门绑定字段的onchange、onclick等事件;第二是表单HTML源码里直接嵌入的script块,适合放页面初始化逻辑;第三是流程设计器里的脚本宏(也就是常说的js宏),它跑在流程节点的操作脚本里,负责处理节点动作,比如提交前自动写入某个字段、回写流程状态等。这三个位置作用域完全不同,很多人说"我写了JS不生效",十有八九是脚本放错了地方。
1.2 字段的"户口名"和显示名别搞混
这是二开新手第一个拦路虎。表单界面上叫"申请人"的字段,在HTML里的控件id可能是field_3291,在数据库里对应字段名又是另一个字符。写JS如果拿界面显示文字去找元素,肯定一找一个空。
正确做法是:用浏览器F12打开开发者工具,直接查看控件id;或者在表单设计器里把字段属性面板打开,看"字段名"。拿到真实id后再写选择器,比如:
jQuery("#field_3291").val("这里是值");还有一类字段是明细表里的子字段,id规则又不一样,通常带detail_或dtable_前缀。判断方式还是在F12里看生成的HTML结构,不要靠猜。实际项目里,我发现至少有三分之一的"脚本无效"问题,最后都定位到字段id写错。
1.3 9.0到e9的脚本差异要心里有数
泛微从9.0到e9,前端框架逐步升级,但对JS开发者来说,最直观的变化是页面里基础库变多了,老版本里很多"裸写"的函数在e9里反而要找新入口。比如弹窗提示,老项目里常见的pop系列函数,在e9部分模块里就要换成layer弹层或者其他jQuery组件。
我的建议很明确:新项目统一走"页面用jQuery加官方事件绑定,流程动作走js宏"的路线,少用老框架特有的全局函数,这样后续升级系统时的兼容成本最低。如果老表单要升到e9,先批量扫描脚本里有没有用旧弹窗函数、旧tab切换函数,这些是最容易无声失效的地方。
2. 高频场景的JS写法与实操代码
2.1 获取流程ID和请求ID
在泛微表单里,几乎每个业务需求都绕不开这两个ID:流程ID(workflowId)和请求ID(requestId)。流程ID指的是这条单据走了哪条流程模板;请求ID则是当前这条实际发起的数据记录ID,也就是业务单据的唯一定位。
最常用的取法,就是直接读页面上隐藏域的值:
var requestId = jQuery("#requestId").val(); var workflowId = jQuery("#workflowId").val();如果是在js宏里,则可以用系统提供的字段取值方式,比如getFieldValue("workflowId")。注意字段名在不同版本里不完全一致,如果取不到,用F12搜索页面上是否有叫workflowId的隐藏输入框,以实际DOM为准。
有了这两个ID,后续很多联动就好做了:拼接单据查看地址、调用接口回传单号、保存来源标识等等。
2.2 字段赋值、清空与联动显示隐藏
字段赋值是表单JS里出现频率最高的操作,没有之一。通用做法是直接操作jQuery对象:
// 给普通字段赋值 jQuery("#field_1001").val("值"); // 赋值后触发change事件,让后续联动逻辑生效 jQuery("#field_1001").val("值").trigger("change"); // 清空表单:文本类控件 jQuery("#form1 input[type='text']").val("");清空这个操作有很多细节。如果只是把所有文本控件的值置空,下拉框和日期控件会留下一堆"看起来空但实际有脏数据"的隐患。更完整的清空逻辑,要连同下拉选择重置、富文本清空、明细表行删除一起处理。我在项目里一般封装成一个resetForm()函数单独维护,避免每次都在页面里堆一大段重复代码。
关于显示隐藏,核心是控制字段所在容器的display样式:
// 控制某个字段是否显示 jQuery("#field_1001").closest("tr").toggle(true); // 显示 jQuery("#field_1001").closest("tr").hide(); // 隐藏实际操作里,字段的父节点不一定是tr,可能是div,所以动手写之前一定要先看DOM结构。
2.3 表单校验规则怎么落地
泛微表单有自带的必填校验,但复杂点的业务校验还是得靠JS。常见做法是拦截提交按钮事件,在提交前执行统一校验函数:
function validateForm() { var mobile = jQuery("#field_2001").val(); if (!/^1[3-9]\d{9}$/.test(mobile)) { alert("请输入正确的手机号"); return false; } if (jQuery("#field_1002").val() == "") { alert("请填写申请人"); return false; } return true; }把这个函数挂到表单的提交事件或者对应按钮的onclick上,返回false就会中断提交。要注意的是,有些泛微版本在节点提交时还会走自己的内置校验,如果自定义校验和内置校验叠加,尽量在同一个环节统一处理,避免用户反复点几次按钮才把所有错误看完。
2.4 js宏在流程节点中的应用
js宏,简单理解就是在流程设计器里配置的一段脚本宏,它比表单前端JS权限更高,能直接操作当前流程的数据,不依赖页面事件。常见用途有:节点提交时自动写入当前时间、根据条件修改某个字段值、回写其他流程的状态等。
基础写法大概长这样:
// 获取当前字段值 var val = getFieldValue("field_1001"); // 写入字段值 setFieldValue("field_1002", "已处理"); // 获取流程id和请求id var workflowId = getFieldValue("workflowId"); var requestId = getFieldValue("requestId");js宏最方便的一点是放在后台,表单页面不用动就能改逻辑,适合做"流程动作触发的数据加工"。但它也最容易出问题,字段名写错、数据类型不匹配、宏执行顺序不确定都可能让你排查到怀疑人生。我给自己定的规矩是:每段宏脚本里至少加一条注释写明用途和适用版本,关键变量输出到日志字段,方便出问题后反查。
3. 从零搭一套可复用的表单JS方案
3.1 先定规矩:脚本放哪里、怎么组织
接手的项目多了你会发现,很多表单的JS脚本是"拆东墙补西墙"改出来的,到最后没人敢动。想解决这个问题,前端脚本就别全堆在表单HTML的script标签里。更稳妥的做法是:表单里只放一个入口函数,把具体实现放到公共脚本库里,按模块拆分。
我常用的组织形式是这样:
- 公共函数库:放通用方法,取值、赋值、校验、提示、日期格式化都放这里。
- 业务页面脚本:只写这个页面独有的联动和初始化逻辑。
- 每个脚本开头:写清楚版本号和适用范围。
这样做的好处很明显,一个弹窗组件升级了,只改公共库,不用翻遍几十张表单逐个替换。很多"表单js大全"里的脚本之所以难用,就是因为没有分层意识,所有代码都揉在一张表单里。
3.2 表单挂工作流时的连接问题
很多人在表单设计器里建好了表单,却不知道怎么让它和真正的流程绑定在一起,或者绑定了以后提交时找不到入口,这应该就是热搜里"挂工作流的连接"想问的事情。
常规流程是:先在流程设计器里新建流程,把流程的表单节点关联到你建好的表单,再设置节点参与人。这里最常见的坑是流程和表单分别在两个入口配置,容易漏掉"发起节点的表单映射"这一步。配置完后,记得用管理员账号发起一次测试流程,确认表单能正常打开、字段能正常读写,再上生产。
如果遇到"表单能打开但流程发起失败",优先检查流程设计器里节点绑定的表单ID是否和实际表单ID一致。很多同事复制表单后没注意ID变了,流程还指着老的ID,自然报错。类似的问题,泛微OA工作门户里新增版块也时常碰到——明明菜单加上了却没人看得到,一般先查界面权限和菜单可见性设置,而不是去改前端页面。
3.3 在表单引擎里接入Vue这类前端框架
不少团队嫌弃泛微原生表单不够现代,想用Vue、Element UI这类前端技术做更友好的界面,于是就有了A-Vue在线表单集成方案之类的需求。
从我的实践经验看,完全绕开表单引擎不现实,因为这些字段最终还得落到泛微的流程和权限体系里。比较顺的思路是"外页面加接口对接":用Vue做独立表单页面,提交时通过泛微接口写入数据,再联动发起流程。这样界面自由度很高,但开发周期也长。
如果只是想给原生表单加一点现代交互,可以在表单里局部引入Vue做渲染。但要注意:泛微自带jQuery,引入Vue后应避免两边同时操作同一个DOM,否则数据同步会互相打架。我的建议是明确分区,比如让Vue只负责某个独立区块,区块内的交互全交给Vue,区块外的联动仍然走jQuery事件。
4. 常见的坑与排查思路
4.1 事件不触发不是玄学
"我明明写了onchange,为什么没反应?"这类问题占了表单JS答疑的一大半。原因一般就三种:选择器错了,根本没选中目标控件;事件绑定的时机太早,页面元素还没渲染完;或者脚本本身就报错了,后面的代码根本没执行到。
排查时先按F12打开控制台,看有没有红色报错;没有报错就给关键代码加console.log,确认代码到底走到哪一步。这个方法土,但效率最高。我见过太多人上来就直接改逻辑,结果最后发现是字段名拼写少了一个字母。
4.2 没有监控权限也想打开页面?去权限模型里找答案
这类需求我遇到不少:部分人没有流程监控权限,但又被要求能点开流程查看表单。泛微的权限模型里,"监控"通常指对流程实例的跟踪查看权限,而普通参与人只能看自己经手的单据。
想放开查看范围,一般不是靠前端JS能解决的,而是去后台权限配置里调整:把对应人员的流程查看范围从"仅本人"调整为"本部门"或指定范围,或者在表单节点上开放"只读"浏览权限。配置位置在流程或节点的权限设置里,不同版本菜单名有点差异,搜索"流程查看"或"数据范围"一般都能找到。改完记得用测试账号验证,别直接拿管理员账号试,因为管理员本身权限大,看不出真实效果。
4.3 老系统升级与脚本兼容性
从9.0升到e9,老表单脚本最容易出问题的几个点:弹窗API变了、tab切换函数变了、一些隐藏域的id生成规则变了。升级前,先把表单清单拉出来,重点检查三类脚本:用到弹窗的、用到tab页的、用了老框架全局函数的,逐类替换成新版本支持的写法,能省很多事后补救的时间。
另外,升级后一定要做一轮"发起-审批-归档"全链路回归测试,因为有些脚本平时看着正常,但到归档环节才执行。别等用户发现了再来救火。
4.4 问题速查表
| 现象 | 大概率原因 | 快速排查方向 |
|---|---|---|
| 事件不触发 | 选择器错误、绑定时机太早、脚本报错 | F12控制台看报错,逐段console.log定位 |
| 字段值设置后没反应 | 字段id拿错,或没触发change事件 | 用F12确认实际id,必要时trigger("change") |
| js宏没执行 | 字段名不匹配、宏脚本位置不对 | 在宏里写入日志字段验证,检查节点配置 |
| 流程发起失败 | 节点绑定的表单ID不对 | 检查流程设计器里的表单映射 |
| 升级后弹窗失效 | 老弹窗API在新版本被移除 | 替换为主流layer弹层方案,不做兼容抹平 |
4.5 调试泛微表单JS的正确姿势
泛微表单页面里,jQuery基本可用,所以调试时最常用的就是console.log加debugger断点。如果脚本塞在js宏里,页面断点不一定好用,建议在宏里拼一个"日志字段",把关键变量写入表单的某个隐藏字段,提交后再检查。
另一个很实用的习惯:改脚本前,先在浏览器控制台里手动执行一遍代码,确认目标元素能被选中、值能写进去,再搬到表单设计器里保存。这能省掉大量"保存了才发现改错了"的来回折腾。
再分享一个我自己的习惯:每次在两个不同版本或者不同模块里验证过的脚本,随手整理成markdown笔记,标注好版本号和环境。时间久了,这份私人笔记比任何网上流传的"js大全"都管用。写脚本这件事,真正拉开差距的不是语法,而是对版本差异、DOM结构和权限模型的熟悉程度,这些东西只能靠一个个项目攒出来。
本文还有配套的精品资源,点击获取