WKWebView遇到_blank的处理方法

本文探讨了WKWebView中target='_blank'导致的超链接加载问题及解决方案,提供了两种处理方法:一是请求前决定跳转,二是重写createWebViewWithConfiguration方法。然而,这些方法虽解决跳转问题,但可能导致页面无法正常返回。

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

在做WKWebView加载的时候,有时候,会发现一个超链接加载不了,或者对应的点击事件,执行不行,实际上跟target='_blank'有着莫大的关系。target='_blank'在HTML中,意味着新创建一个window窗口加载,也就是,不再是mainframe了。但是在UIWebView中,只有一个页面,所以,UIWebView会自动的在当前页面渲染新的链接内容。

解决思路有两个。

一) 在发起请求的时候根据发起请求的类型,进行处理,可以强制加载到一个一个WKWebView中去。

//在发起请求之前 决定跳转

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
    switch (navigationAction.navigationType) {
        case WKNavigationTypeLinkActivated:
            //超链接
            [webView loadRequest:navigationAction.request];
            break;
                    default:
            break;
    }
    decisionHandler(WKNavigationActionPolicyAllow);
}

WKNavigationAction中,有两个属性,sourceFrame和targetFrame,sourceFrame代表着原有加载链接的属性,targetFrame是代表着即将加载的链接的属性,其中都是属于WKFrameInfo的类型,可以通过isMainFrame,判断是在主窗口加载的,还是需要新创建一个窗口加载。

二)点击新创建一个window窗口的时候,会走UIDelegate的方法。但是,如果你没有设置UIDelegate的代理,以及实现createWebViewWithConfiguration方法,WKWebView将会什么都不做。

- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures{
//判断即将加载的 链接是不是在主窗口 显示的,如果不是 直接在当前的主窗口中加载 
    if (!navigationAction.targetFrame.isMainFrame) {
        [webView loadRequest:navigationAction.request];
    }
    return nil;
}

参考学习文章https://www.jianshu.com/p/3a75d7348843

但是,这两种方法解决了跳转的问题,却带来了页面无法正常返回的问题,尚待解决。

 

在Linux内核中,`FB_EARLY_EVENT_BLANK`是一个与帧缓冲(Framebuffer)相关的早期事件头文件。它通常用于在系统启动早期处理显示器的空白(blank)和取消空白(unblank)事件。这个头文件定义了一些事件和宏,用于通知帧缓冲设备的状态变化。 `FB_EARLY_EVENT_BLANK`头文件通常包含在Linux内核源码中的`include/linux`目录下,具体路径可能是`include/linux/fb.h`。这个头文件定义了一些事件类型和宏,用于处理帧缓冲设备的状态变化。 以下是一个简单的示例,展示了如何使用`FB_EARLY_EVENT_BLANK`头文件: ```c #include <linux/fb.h> #include <linux/console.h> static int fb_blank_callback(struct fb_event *event, void *data) { int blank_mode = *((int *)event->data); struct fb_info *info = event->info; switch (blank_mode) { case FB_BLANK_UNBLANK: // 取消空白事件处理 console_printk(KERN_INFO "Framebuffer unblanked\n"); break; case FB_BLANK_NORMAL: case FB_BLANK_VSYNC_SUSPEND: case FB_BLANK_HSYNC_SUSPEND: case FB_BLANK_POWERDOWN: // 空白事件处理 console_printk(KERN_INFO "Framebuffer blanked\n"); break; default: console_printk(KERN_INFO "Unknown blank mode\n"); break; } return 0; } static int __init fb_blank_init(void) { int ret; ret = register_framebuffer_event(fb_blank_callback, NULL); if (ret) { console_printk(KERN_ERR "Failed to register framebuffer event\n"); } return ret; } static void __exit fb_blank_exit(void) { unregister_framebuffer_event(fb_blank_callback, NULL); } module_init(fb_blank_init); module_exit(fb_blank_exit); ``` 在这个示例中,`fb_blank_callback`函数是一个回调函数,用于处理帧缓冲设备的空白和取消空白事件。`fb_blank_init`和`fb_blank_exit`函数分别用于注册和注销事件回调。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值