从JavaScript调用Java Applet函数报错:document.PrintApplet.print不是函数
解决document.PrintApplet.print is not a function报错问题
1. 修复JSP中Applet的参数配置错误
你的Admin.jsp里有两个param标签存在语法错误:cache_version和permissions参数重复使用了name属性,正确格式应为name指定参数名,value指定参数值。错误的配置会导致Applet无法正确加载,自然找不到print方法。修正后的代码如下:
<object type="application/x-java-applet" name="PrintApplet" width="1" height="1"> <param name="codebase" value="applet" /> <param name="cache_archive" value="PrintingApplet-0.1.3.jar" /> <param name="code" value="com.abc.PrintApplet" /> <param name="cache_version" value="1.0.0.1"/> <param name="initial_focus" value="false"> <param name="permissions" value="all-permissions"/> </object>
2. 确保Applet完全初始化后再调用方法
Java Applet加载需要一定时间,直接在页面加载阶段调用其方法会因为Applet未就绪而报错。可以通过以下两种方式处理:
方式一:重试机制
在printLabel.js中添加重试逻辑,直到Applet的print方法可用:
function printLabel(p1, p2, p3, p4) { const applet = document.PrintApplet; if (applet && typeof applet.print === 'function') { applet.print(p1, p2, p3, p4); } else { // 延迟100ms重试,可根据实际情况调整重试次数 setTimeout(() => printLabel(p1, p2, p3, p4), 100); } }
方式二:Applet初始化回调
修改Java Applet代码,在init()方法完成后通知JavaScript:
import netscape.javascript.JSObject; import java.applet.Applet; public class PrintApplet extends Applet { @Override public void init() { // 原有初始化逻辑 ... // 通知JavaScript Applet已就绪 JSObject window = JSObject.getWindow(this); window.call("onAppletReady", null); } public void print(String p1, String p2, String p3, String p4) { // 打印业务逻辑 ... } }
然后在printLabel.js中监听回调:
let isAppletReady = false; function onAppletReady() { isAppletReady = true; } function printLabel(p1, p2, p3, p4) { if (isAppletReady) { document.PrintApplet.print(p1, p2, p3, p4); } else { alert("打印控件正在加载,请稍后重试"); } }
3. 验证Applet方法签名与类路径
- 确保Java Applet中的
print方法是public修饰的,且参数类型与JavaScript传递的参数兼容(比如都是字符串类型)。 - 确认WAR包的
applet子目录下存在PrintingApplet-0.1.3.jar,且jar包内正确包含com.abc.PrintApplet类(注意Java类名大小写敏感)。
4. 检查浏览器兼容性
现代主流浏览器(Chrome 45+、Firefox 52+等)已移除对Java Applet的支持,需使用仍支持Applet的浏览器(如Firefox ESR 52系列、IE浏览器),并确保Java插件已启用。
内容的提问来源于stack exchange,提问作者Jim B
相关产品推荐
相关产品推荐

