javascript - 如何在渲染完成之前在 UIWebView 中阻止 Javascript 警报|确认|提示?

标签 javascript ios objective-c uiwebview

关于 SO 的多个问题已经解决了类似的问题,但没有一个能回答我的确切问题类型。大多数答案涉及运行 JS 片段并重载警报方法,如下所示:window.alert = function() {};

我遇到的问题是加载的网页(我无法控制内容)在整个页面呈现完成之前打开了一个警报。

因此,我无法使用:- (void)webViewDidFinishLoad:(UIWebView *)webView 委托(delegate)方法来运行 JS 片段。此外,在 - (void)webViewDidStartLoad:(UIWebView *)webView 中运行相同的代码段对我没有任何好处,因为它在加载 DOM 之前执行。

类似问题:

有什么建议吗?

最佳答案

在对有关注入(inject) Javascript 的建议解决方案进行了一些试验后,我又回到了 native 平台。

由于 UIWebView 将所有 Javascript 警报转换为 native UIAlertViews,因此在 native 端阻止它相当简单。查看 UIAlertView.h,只有一种用于显示警报的公共(public)方法可以方便地称为:- (void)show;

此方法可以很容易地在子类中或通过类别被覆盖。我最终使用了一个类别,因为 the documentation提到子类化 UIAlertView 的警告。

@interface UIAlertView (Blocker)
@end

#import "UIAlertView+Blocker.h"

@implementation UIAlertView (Blocker)

- (void)show {
   return;
}
@end

在包含 UIWebView 的 View Controller 中导入此类别将阻止 UIAlertView 的所有实例,进而也会阻止所有 JS 警报。

我发现此解决方案更可靠,因为它不依赖于注入(inject) Javascript、更改 HTML 或使用第三方库。它也与时间无关(JS 警报代码可以在 header 、正文或某些第三方库中)。

关于javascript - 如何在渲染完成之前在 UIWebView 中阻止 Javascript 警报|确认|提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21577726/

相关文章:

ios - 如何判断 Siri 在应用程序使用期间是否处于事件状态

ios - 如何从 UIScrollView 中删除 CAShapeLayer?

Javascript ReactJs 将 JsCss 和 Component 放在外部文件中

ios - URLQuery item 没有抓取位置坐标

javascript - 创建响应式图像的最简单方法是什么?

ios - 将核心数据与 SwiftUI 结合使用

ios - 我可以得到 JSON 响应而不是 xml 吗?在 ASIs3bucketRequest 中

objective-c - 在基于 View 的 NSTableView 上更改选择颜色

javascript - 为 promise 链定义后备捕获?

javascript - 在 google-chrome 扩展中使用 javascript 聚焦文本框