关于 SO 的多个问题已经解决了类似的问题,但没有一个能回答我的确切问题类型。大多数答案涉及运行 JS 片段并重载警报方法,如下所示:window.alert = function() {};
我遇到的问题是加载的网页(我无法控制内容)在整个页面呈现完成之前打开了一个警报。
因此,我无法使用:- (void)webViewDidFinishLoad:(UIWebView *)webView
委托(delegate)方法来运行 JS 片段。此外,在 - (void)webViewDidStartLoad:(UIWebView *)webView
中运行相同的代码段对我没有任何好处,因为它在加载 DOM 之前执行。
类似问题:
- Capture (and prevent) alert() modal in UIWebView
- Can I handle alert inside UIWebViewDelegate?
- UIWebView: Can I disable the javascript alert() inside any web page?
有什么建议吗?
最佳答案
在对有关注入(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/