有很多关于SO的问题已经解决了类似的问题,但没有一个问题可以解答我的确切类型。大多数答案涉及运行JS片段并重载警报方法:window.alert = function() {};
我遇到的问题是加载的网页(我无法控制内容)在整个页面呈现完成之前打开警报。
因此我不能使用:- (void)webViewDidFinishLoad:(UIWebView *)webView
委托方法来运行JS片段。另外,在- (void)webViewDidStartLoad:(UIWebView *)webView
中运行相同的片段对我没有任何帮助,因为它在加载DOM之前执行。
类似的问题:
关于此的任何指示?
答案 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。
您可能希望查看的一件事是覆盖此功能的第三方库,如果您将警报告知为空白并且在另一个脚本告诉它不是空白之后,那么以太删除该库,更改执行顺序或修改该库。