如何在GWT中实现浏览器标签可见性检测及编译错误解决
解决GWT中检测浏览器标签可见性的问题
一、修复编译错误
你遇到的语法错误是因为GWT的JSNI(JavaScript原生接口)不支持ES6箭头函数,必须改用传统的function()语法改写回调逻辑。修正后的原生方法代码如下:
public class TGC_BrowserTabUtils { // 用于存储标签可见状态的静态变量 private static boolean tabIsVisible = true; // 默认标签处于可见状态 public static native void addVisibilityChangeListener() /*-{ $doc.addEventListener("visibilitychange", function() { // 用JSNI语法更新Java静态变量的值 @com.tugalsan.api.gui.client.browser.TGC_BrowserTabUtils::tabIsVisible = !$doc.hidden; console.log("tabIsVisible: " + !$doc.hidden); }); }-*/; }
关键修改点:
- 将ES6箭头函数
() => {}替换为标准的function() {} - 通过
@包名.类名::变量名的JSNI语法直接更新Java类的静态变量
二、获取标签可见状态的值
在类中定义静态变量存储状态,并提供公共getter方法,即可在GWT代码的任何地方获取当前标签的可见性:
public class TGC_BrowserTabUtils { private static boolean tabIsVisible = true; public static native void addVisibilityChangeListener() /*-{ $doc.addEventListener("visibilitychange", function() { @com.tugalsan.api.gui.client.browser.TGC_BrowserTabUtils::tabIsVisible = !$doc.hidden; }); }-*/; // 供其他代码调用的公共方法,返回标签可见状态 public static boolean getTabIsVisible() { return tabIsVisible; } }
三、实际使用示例
在定时任务逻辑中,通过判断标签可见状态决定是否请求服务器:
// 程序初始化时注册监听 TGC_BrowserTabUtils.addVisibilityChangeListener(); // 定时任务:每分钟检查一次 Timer.scheduleRepeating(new Timer() { @Override public void run() { if (TGC_BrowserTabUtils.getTabIsVisible()) { // 标签处于活跃状态,调用服务器获取最新数据 fetchLatestDataFromServer(); } } }, 0, 60000);
内容的提问来源于stack exchange,提问作者Tugalsan Karabacak
相关产品推荐
相关产品推荐

