如何阻止JavaScript警报|确认|在渲染完成之前在UIWebView中的PROMT



已经有多个问题,因此已经解决了类似的问题,但是没有一个回答我的确切类型的问题。大多数答案都涉及运行JS片段并使警报方法超载:window.alert = function() {};

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

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

类似的问题:

  • uiwebview中的捕获(和预防)alert()模态
  • 我可以在uiwebviewdelegate内部处理警报吗?
  • uiwebview:我可以在任何网页中禁用JavaScript alert()?

上面有任何指针?

在使用有关注入JavaScript的建议解决方案进行了一些实验后,我倒在本机平台上。

由于UIWebView将所有JavaScript警报转换为本机UIAlertViews,因此将其阻塞在本机端非常简单。研究UIAlertView.h,只有一种公开方法可以显示一个通知,该方法很方便地称为: - (void)show;

此方法可以在子类中或通过类别中被覆盖。我最终使用了一个类别,因为该文档提到了子类UIAlertView的警告。

@interface UIAlertView (Blocker)
@end
#import "UIAlertView+Blocker.h"
@implementation UIAlertView (Blocker)
- (void)show {
   return;
}
@end

在持有UIWebView的视图控制器中导入此类别将阻止UIAlertView的所有实例,进而将所有JS警报。

我发现此解决方案更强大,因为它不依赖于注射JavaScript,更改HTML或使用第三方库。它也与时机无关(JS-ALERT代码可以在标题,主体或某些第三方LIB中)。

看来,结果可能会根据渲染引擎而有所不同,有几种方法,似乎对我有用的方法:

alert("something");
alert = function(){};
alert("awesome");

http://jsfiddle.net/g5s5m/我知道Chrome使用的V8引擎与Firefox或IE使用的V8引擎不同,因此在制作复杂的Web应用程序时,必须真正开始思考,因为并非所有浏览器都将JavaScript解释为同一道。

您可能想看的一件事是覆盖此功能的第三方库,就像如果您告诉警报为空白,并且在另一个脚本告诉它不是空白之后,请删除该库,更改执行订单或修改该库。

最新更新