UIWebView respond to Javascript calls(UIWebView 响应 Javascript 调用)
问题描述
如何像 Mobile Safari 那样拦截诸如 window.open 之类的 Javascript 调用?我还没有看到任何关于此的列表,但它一定有可能吗?
How can I intercept Javascript calls such as window.open as Mobile Safari does? I haven't seen anything listed about this, but it must be possible somehow?
以前有人做过吗?
推荐答案
当页面完成加载(webViewDidFinishLoad:) 时,注入一个 window.open 覆盖.当然,它不适用于在页面加载期间调用的 window.open.然后使用自定义方案来回调您的目标 C 代码.
好的,我已经测试过了.现在可以了.
创建一个新的基于视图"的项目,并使用 IB 在 viewcontroller xib 中添加一个 webview.
When the page is finished loaded (webViewDidFinishLoad:), inject a window.open override. Of course it will not work for window.open which are called during page load.
Then use a custom scheme to callback your objective C code.
OK I have tested it. Now it works.
Create a new "view based" project and add a webview in the viewcontroller xib using IB.
@implementation todel2ViewController
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
NSString* page = @"<html><head></head><body><div onclick='javascript:window.open("http://www.google.com");'>this is a test<br/>dfsfsdfsdfsdfdsfs</div></body></html>";
[self.view loadHTMLString:page baseURL:[NSURL URLWithString:@""]];
}
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSString* urlString = [[request URL ] absoluteString ];
NSLog(@"shouldStartLoadWithRequest navigationType=%d", navigationType);
NSLog(@"%@", urlString);
if ([[[request URL] scheme] isEqualToString:@"myappscheme"] == YES)
{
//do something
NSLog(@"it works");
}
return YES;
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
//Override Window
NSString*override = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"NewWindow" ofType:@"js"] encoding:4 error:nil];
[self.view stringByEvaluatingJavaScriptFromString:override];
}
@end
Javascript:
The Javascript:
var open_ = window.open;
window.open = function(url, name, properties)
{
var prefix = 'csmobile://';
var address = url;
open_(prefix + address);
return open_(url, name, properties);
};
日志
2011-07-05 14:17:04.383 todel2[31038:207] shouldStartLoadWithRequest navigationType=5
2011-07-05 14:17:04.383 todel2[31038:207] myappscheme:it%20works
2011-07-05 14:17:04.384 todel2[31038:207] it works
2011-07-05 14:17:04.386 todel2[31038:207] shouldStartLoadWithRequest navigationType=5
2011-07-05 14:17:04.386 todel2[31038:207] http://www.google.com/
这篇关于UIWebView 响应 Javascript 调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:UIWebView 响应 Javascript 调用
基础教程推荐
- Xcode UIView.init(frame:) 只能在主线程中使用 2022-01-01
- SwiftUI-ScrollViewReader的ScrollTo不滚动 2022-01-01
- Play 商店的设备兼容性问题 2022-01-01
- navigationItem.backBarButtonItem 不工作?为什么上一个菜单仍然显示为按钮? 2022-01-01
- iOS - UINavigationController 添加多个正确的项目? 2022-01-01
- 如何比较两个 NSDate:哪个是最近的? 2022-01-01
- UIImage 在开始时不适合 UIScrollView 2022-01-01
- 为什么姜饼模拟器方向卡在应用程序中? 2022-01-01
- Android Volley - 如何动画图像加载? 2022-01-01
- 如何将图像从一项活动发送到另一项活动? 2022-01-01
