You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 17:21:01