如何在渲染完成前阻止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删除这个库,改变执行顺序或者修改该库。