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

如何阻止WebView中“在新标签页打开”链接弹出窗口并获取URL

拦截WebView新窗口并获取目标链接的实现方案

Android 平台(原生WebView)

WebView点击带target="_blank"的链接时会默认触发新窗口,要拦截这个行为并拿到URL,只需重写WebChromeClient的onCreateWindow方法,同时开启多窗口支持:

  • 先给WebView开启多窗口支持,否则onCreateWindow不会被触发
  • 重写onCreateWindow,从回调参数里提取目标URL,返回false阻止新窗口创建

代码示例:

webView.setSupportMultipleWindows(true);
webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
        // 提取新窗口的目标URL
        WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
        String targetUrl = transport.getWebView().getUrl();
        // 这里可以对URL做任意处理,比如打印、存储
        Log.d("WebView", "拦截到新窗口链接:" + targetUrl);
        // 返回false直接阻止新窗口打开
        return false;
    }
});

// 额外设置:让普通链接在当前WebView打开,避免跳转到系统浏览器
webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        view.loadUrl(request.getUrl().toString());
        return true;
    }
});

iOS 平台(WKWebView)

WKWebView处理新窗口请求需要实现WKUIDelegate协议,重写对应方法即可拦截并获取URL:

  • 给WKWebView设置uiDelegate,重写createWebViewWithConfiguration方法
  • 判断是否是新窗口请求,提取URL后返回nil阻止新窗口创建

代码示例:

import WebKit

class ViewController: UIViewController, WKUIDelegate {
    var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let config = WKWebViewConfiguration()
        webView = WKWebView(frame: view.bounds, configuration: config)
        webView.uiDelegate = self
        view.addSubview(webView)
        
        // 加载目标页面
        if let url = URL(string: "https://example.com") {
            webView.load(URLRequest(url: url))
        }
    }

    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
        // 筛选新窗口请求(targetFrame为空)
        if navigationAction.targetFrame == nil {
            if let targetUrl = navigationAction.request.url?.absoluteString {
                print("拦截到新窗口链接:\(targetUrl)")
                // 可选:如果想在当前WebView打开这个链接,取消下面注释
                // webView.load(navigationAction.request)
            }
        }
        // 返回nil阻止新窗口创建
        return nil
    }
}

React Native 平台(react-native-webview)

使用react-native-webview组件时,通过onShouldStartLoadWithRequest回调就能拦截新窗口请求:

  • 检查请求的navigationType是否为'other'(对应新窗口打开的场景)
  • 提取URL后返回false阻止跳转

代码示例:

import React from 'react';
import { WebView } from 'react-native-webview';

const MyWebView = () => {
  const handleLoadRequest = (request) => {
    // 拦截新窗口打开的请求
    if (request.navigationType === 'other') {
      console.log('拦截到新窗口链接:', request.url);
      return false;
    }
    // 允许正常的页面跳转
    return true;
  };

  return (
    <WebView
      source={{ uri: 'https://example.com' }}
      onShouldStartLoadWithRequest={handleLoadRequest}
      javaScriptEnabled={true}
    />
  );
};

export default MyWebView;

内容的提问来源于stack exchange,提问作者notAperson535

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:01:52