我可以在UIWebViewDelegate中处理警报吗?

时间:2009-10-14 09:03:11

标签: javascript iphone uiwebview

<script language="javascript">
    alert("Hell! UIWebView!");
</script>

我可以在我的UIWebView 中看到警告消息,但可以处理这种情况吗?

更新

我正在将一个网页加载到我的UIWebView:

- (void)login {
    NSString *requestText = [[NSString alloc] initWithFormat: @"%@?user=%@&password=%@", DEFAULT_URL, user.name, user.password];    // YES, I'm using GET request to send password :)
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:requestText]];
    [webView loadRequest:request];
}

目标页面包含JS。如果用户名或密码不正确,则此JS显示警报。 我没有访问其来源。 我想在我的UIWebViewDelegate中处理它。

3 个答案:

答案 0 :(得分:15)

此问题的更好解决方案是为方法

创建UIWebView的类别
webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:

这样您就可以以任何您想要的方式处理警报事件。我这样做是因为我不喜欢UIWebView的默认行为,因为它将源文件名放在UIAlertView标题中。类别看起来像这样,

@interface UIWebView (JavaScriptAlert) 

- (void)webView:(UIWebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame;

@end

@implementation UIWebView (JavaScriptAlert)

- (void)webView:(UIWebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame {
    UIAlertView* dialogue = [[UIAlertView alloc] initWithTitle:nil message:message delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil];
    [dialogue show];
    [dialogue autorelease];
}

@end

答案 1 :(得分:4)

这似乎是这样做的:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    JSContext *ctx = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    ctx[@"window"][@"alert"] = ^(JSValue *message) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"JavaScript Alert" message:[message toString] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
    };
}

注意:仅在iOS 8上测试。

答案 2 :(得分:3)

如果通过“包含闪光灯”表示您正在加载到网页视图中的页面中有一部Adobe Flash电影,那我就不走运了。 Mobile Safari不支持Flash,很可能永远不会支持Flash。

在一般情况下,如果您希望在Web视图中运行的JavaScript与托管它的本机应用程序通信,您可以加载虚假URL(例如:“myapp:// alert?+ + + + + +警报+那张+这里。“)。这将触发webView:shouldStartLoadWithRequest:navigationType:委托方法。在该方法中,检查请求,如果正在加载的URL是这些内部通信之一,请在您的应用中触发相应的操作,然后返回NO