【问题标题】:How to block Javascript alert|confirm|promt in UIWebView before render completed?如何在渲染完成之前在 UIWebView 中阻止 Javascript 警报|确认|提示?
【发布时间】:2014-03-01 21:53:30
【问题描述】:

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

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

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

类似问题:

这方面有什么建议吗?

【问题讨论】:

  • 你能把创建警报的脚本移到上面一行

标签: javascript ios objective-c uiwebview


【解决方案1】:

似乎结果可能会因渲染引擎而异,有几种方法,似乎对我有用的是:

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

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

您可能想要查看的一件事是覆盖此函数的第三方库,例如,如果您告诉 alert 为空白,而在另一个脚本告诉它不要为空白之后,那么以太删除该库,更改执行顺序或修改该库。

【讨论】:

  • 我可以确认,在整个页面已加载(已调用 webViewDidFinishLoad:)之后显示警报的网页上,此解决方法确实有效。但是我现在遇到的问题是警报在所有内容呈现之前打开。您是否建议我注入某种 JS-lib 来处理这个问题?
  • 您可以将其包装在 isReady 函数中 learn.jquery.com/using-jquery-core/document-ready
  • 我最终使用原生解决方案来解决这个问题。它感觉更健壮,更适合我自己的舒适区。
【解决方案2】:

在尝试了一些有关注入 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 警报。

我发现这个解决方案更强大,因为它不依赖于注入 Javascript、更改 HTML 或使用第三方库。它也与时间无关(JS-alert 代码可以在 header、body 或某些第三方库中)。

【讨论】:

猜你喜欢
  • 2019-12-31
  • 2020-09-06
  • 2016-09-24
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2018-04-21
相关资源
最近更新 更多