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

时间:2014-02-05 12:46:34

标签: javascript ios objective-c uiwebview

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

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

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

类似的问题:

关于此的任何指示?

2 个答案:

答案 0 :(得分:9)

在尝试了一些关于注入Javascript的建议解决方案之后,我回到了原生平台上。

由于UIWebView将所有Javascript警报转换为本机UIAlertViews,因此在本机端阻止它是相当简单的。查看UIAlertView.h,只有一种公开方法可以显示一个方便的名为- (void)show;的警报。

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

@interface UIAlertView (Blocker)
@end

#import "UIAlertView+Blocker.h"

@implementation UIAlertView (Blocker)

- (void)show {
   return;
}
@end

在包含UIWebView的视图控制器中导入此类别将阻止UIAlertView的所有实例,反过来也会阻止所有JS警报。

我发现这个解决方案更加健壮,因为它不依赖于注入Javascripts,更改HTML或使用第三方库。它与时间无关(JS警报代码可以在标题,正文或某些第三方库中)。

答案 1 :(得分:0)

似乎结果可能会因渲染引擎而异,有几种方法,对我来说似乎有什么用呢:

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

http://jsfiddle.net/g5S5M/ 我知道chrome使用的V8引擎与firefox或IE使用的引擎不同,所以在制作复杂的Web应用程序时,必须真正开始思考,因为并非所有的浏览器都会以相同的方式进行javascript。

您可能希望查看的一件事是覆盖此功能的第三方库,如果您将警报告知为空白并且在另一个脚本告诉它不是空白之后,那么以太删除该库,更改执行顺序或修改该库。