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