首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android WebView 錨點鏈接二次點擊失效修復:reload() 重載與 WebViewClient 方案

     編輯:程式設計綜合問答

現象:WebView 加載包含錨點鏈接(<a href="#C4">)的 HTML,首次點擊跳轉正常,二次點擊同一鏈接無反應。部分舊設備(Android 2.2)複現率高。

根因:WebView 判定「同 URL 不重載」

點擊錨點鏈接時,URL 變為 file:///android_asset/chapters.html#C4。WebView 內部認為「文檔未變、僅片段識別符變化」,**攔截導航請求**,不觸發重載,導致 JS 滾動邏輯不再執行。

方案一:手勢監聽強制 reload()(簡單暴力)

webView.setOnTouchListener((v, event) -> {
    if (event.getAction() == MotionEvent.ACTION_UP) {
        webView.reload(); // 每次點擊強制重載
    }
    return false;
});

缺點:閃屏、丟失滾動位置、性能差。

方案二:WebViewClient.onPageFinished 智能重載(推薦)

webView.setWebViewClient(new WebViewClient() {
    private boolean isAnchorNavigation = false;
    
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.contains("#")) {
            isAnchorNavigation = true;
        }
        return false; // 允許 WebView 處理
    }
    
    @Override
    public void onPageFinished(WebView view, String url) {
        if (isAnchorNavigation) {
            isAnchorNavigation = false;
            // 強制重載同一 URL 觸發錨點跳轉
            view.loadUrl(url); 
        }
    }
});

方案三:JS 監聽 hashchange 事件(現代標準)

在 HTML 中注入:

<script>
window.addEventListener('hashchange', function() {
    var id = location.hash.substring(1);
    var el = document.getElementById(id) || document.querySelector('a[name="' + id + '"]');
    if (el) el.scrollIntoView();
});
</script>

優點:無需重載、體驗流暢、符合 Web 標準。

方案四:升級 WebView 內核 / 使用 Chrome Custom Tabs

Android 4.4+ (Chromium WebView) 已修復此問題。若必須支持 2.2,建議嵌入 Crosswalk (已停止維護) 或引導用戶升級系統。

總結

方案優點缺點
reload()代碼極少閃屏、狀態丟失
WebViewClient 重載可控、兼容舊版仍有重載開銷
JS hashchange零重載、體驗最佳需修改 HTML/注入 JS

優先採用 JS hashchange 方案,從根源解決錨點導航問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved