Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以在UIWebViewDelegate中处理警报吗?_Javascript_Iphone_Uiwebview - Fatal编程技术网

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

Javascript 我可以在UIWebViewDelegate中处理警报吗?,javascript,iphone,uiwebview,Javascript,Iphone,Uiwebview,目标页面包含一个JS。如果用户名或密码不正确,此JS显示警报。 我无法找到它的来源。 我想在UIWebViewDelegate中处理它。如果“包含flash”是指加载到web视图中的页面中包含Adobe flash电影,恐怕你运气不好。Mobile Safari不支持Flash,而且很可能永远也不支持 在一般情况下,如果希望在web视图中运行的JavaScript与承载它的本机应用程序通信,可以加载假URL(例如:myapp://alert?The+文本+的+警报+转到+此处。“)。这将触发委托

目标页面包含一个JS。如果用户名或密码不正确,此JS显示警报。 我无法找到它的来源。 我想在UIWebViewDelegate中处理它。

如果“包含flash”是指加载到web视图中的页面中包含Adobe flash电影,恐怕你运气不好。Mobile Safari不支持Flash,而且很可能永远也不支持


在一般情况下,如果希望在web视图中运行的JavaScript与承载它的本机应用程序通信,可以加载假URL(例如:myapp://alert?The+文本+的+警报+转到+此处。“)。这将触发委托方法。在该方法中,检查请求,如果加载的URL是这些内部通信之一,则在应用程序中触发相应的操作,并返回
NO

此问题的更好解决方案是为该方法的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];
}
这样,您就可以按自己喜欢的任何方式处理警报事件。我这样做是因为我不喜欢UIWebView将源文件名放在UIAlertView标题中时的默认行为。类别看起来像这样

webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:
这似乎可以做到:

@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

注意:仅在iOS 8上测试。

调用警报时,是否要执行其他操作?如何处理?使用JavaScript,您可以重新定义alert()函数以执行您希望它执行的任何操作,例如,调用您自己的函数;这就是你要问的吗?谢谢。这就是我需要的方法。)我同意这个解决方案更好。似乎这就是PhoneGap的用途。有了它,您可以在javascript中调用alert(“message”),并且可以在页面加载时执行任何您喜欢的调用。
@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
- (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];
    };
}