PDF表单同名复选框组值获取的跨查看器兼容问题求助
PDF表单同名复选框组值获取的跨查看器兼容问题求助
我遇到了一个PDF表单的兼容性问题,想请教大家怎么解决:
我做了一个PDF表单,里面有一组同名的复选框,设置成用户只能选其中一个,而且可以取消选中。我写了个计算脚本,想用选中的复选框值来自动填充另一个字段的价格。这个脚本在Adobe Acrobat里完全正常,但在Edge/Chrome的浏览器内置PDF查看器里,只会获取这组复选框里的第一个字段值,不管实际选中的是哪一个。
我的原脚本是这样的:
var Membership_Type = this.getField("Membership_Type").valueAsString; var price = 0; switch(Membership_Type) { case "Family": price = 50; break; case "Couple": price = 30; break; case "Individual": price = 20; break; } event.value = price;
问题分析
查了下原因,不同PDF查看器对同名复选框组的valueAsString处理逻辑不一样:Adobe Acrobat会智能返回当前选中的那个复选框的取值,但浏览器里的PDF引擎可能把同名字段当成一个集合,直接取valueAsString只会返回第一个实例的值,不会识别选中状态。
解决方法
我们可以换个思路,遍历这个同名字段的所有实例,找到被选中的那个再获取它的值。修改后的脚本如下:
var price = 0; // 获取同名复选框的所有实例 var membershipFields = this.getField("Membership_Type"); // 遍历每个实例 for (var i = 0; i < membershipFields.length; i++) { var field = membershipFields.get(i); // 检查是否被选中(PDF复选框未选中时默认值为"Off") if (field.value !== "Off") { switch(field.value) { case "Family": price = 50; break; case "Couple": price = 30; break; case "Individual": price = 20; break; } // 单选组找到选中项后直接跳出循环 break; } } // 赋值给目标字段 event.value = price;
额外说明
- 这里用
field.value !== "Off"判断选中状态,是因为PDF复选框未选中时的标准默认值为"Off",选中时会返回你设置的自定义值(比如"Family")。 - 因为是单选组,找到第一个选中的实例就可以跳出循环,避免不必要的遍历。
- 这个方法在Adobe Acrobat和主流浏览器的PDF查看器里都能正常工作,完美覆盖你的需求。
你可以试试把这个脚本替换原来的,应该就能解决跨查看器的兼容问题了。
备注:内容来源于stack exchange,提问作者Josh Cronin
相关产品推荐
相关产品推荐

