如何在渲染完成前阻止UIWebView中的Javascript alert | confirm | promt?

对于已经处理类似问题的问题,有很多问题,但没有一个能够回答我确切的问题。 大部分的答案都涉及到运行一个JS代码片段,并重载alert方法,如: window.alert = function() {};

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

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

类似的问题:

  • 在UIWebView中捕获(并阻止)alert()模态
  • 我可以处理UIWebViewDelegate内部的警报吗?
  • UIWebView:我可以禁用任何网页内的JavaScript alert()吗?

任何指针呢?

在尝试了一些关于注入Javascript的build议解决scheme之后,我又回到了本地平台。

由于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警报。

我发现这个解决scheme更强大,因为它不dependency injectionJavaScript,更改HTML或使用第三方库。 这也与时间无关(JS警报代码可以在头文件,正文或第三方库中)。

看来,结果可能会有所不同,基于渲染引擎,有几种方法,似乎为我工作这是什么:

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

http://jsfiddle.net/g5S5M/我知道,铬使用的V8引擎是不一样的Firefox或IE使用,所以当做复杂的Web应用程序必须真正开始思考,因为不是所有的浏览器interpred JavaScript一样的方法。

有一件事你可能想要看的是第三方库重写这个函数,如果你告诉alert是空的,在另一个脚本告诉它不是空的之后,那么ether删除这个库,改变执行顺序或者修改该库。