开发中遇到window.open造成的webview白屏问题

本文详细介绍了在H5嵌套项目中遇到的window.open和window.close导致的问题及其解决方法。主要讨论了在iOS设备上使用UIWebView和WKWebView时如何正确处理这两个函数,避免页面白屏或跳转到新窗口的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一个H5嵌套项目中遇到这样一个问题,当我点击H5页面的某个按钮时,webview页面直接白屏了,开始我怀疑自己的代码是不是由于疏漏移除了WebView,当我用Safari打开调试模式发现,webView存在,内容变成了about:blank,由于我对H5不是很了解,所以请教了H5的开发,那边说就是正常的链接打开,并说在调试工具里面正常,尼玛~~~~。后来我直接在Safari打开H5页面,确实能正常显示,但是每次会在web页面打开一个新的tab,即新的窗口。这时我再问H5的开发同学,他才告诉我用的window.open方式打开的一个新的跳转链接,@#¥&%(##)。。。。于是原因找到了。进入正题,window.open,window.close在iOS中怎么去处理???

1、UIWebView处理方式

重写全局函数window.open 和 window.close.

NSString *js = @"window.open = function(url, d1, d2) { window.location = \"open://\" + url;}";

[webView stringByEvaluatingJavaScriptFromString:js];
NSString *js = @"window.close = function() {window.location.assign(\"back://\" + window.location);};";

[webView stringByEvaluatingJavaScriptFromString:js];

然后自己去实现open://  和 back:// 就可以了

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    
    NSString *requestURL = request.URL.absoluteString;
    if ([requestURL hasPrefix:@"open://"]) {
        //打开的处理
    } else if ([requestURL hasPrefix:@"back://"]) {
        //返回的处理
    }
}

2、WKWebView处理方式

在WK中,框架已经将这个问题简单化了,通过代理<WKUIDelegate>的方式告诉我们了,我们只需要在协议的实现中处理即可。

- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {

    //navigationAction 里面能得到链接、frame等信息,重点处理
    //如果不想跳转到新的窗口
    return nil; 
    //如果需要跳转新的窗口,重新实例化一个webview并将新的WebView返回即可。下面是伪代码,具体实现自己处理
    return [WKWebView new];
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值