UIWebView отвечает на вызовы Javascript - PullRequest
3 голосов
/ 29 июня 2011

Как я могу перехватить вызовы Javascript, такие как window.open, как это делает Mobile Safari? Я не видел ничего перечисленного по этому поводу, но это должно быть как-то возможно?

Кто-нибудь делал это раньше?

1 Ответ

8 голосов
/ 05 июля 2011

Когда страница будет загружена (webViewDidFinishLoad :), введите переопределение window.open. Конечно, это не будет работать для window.open, который вызывается во время загрузки страницы. Затем используйте пользовательскую схему для обратного вызова вашего целевого кода C.
[РЕДАКТИРОВАТЬ] ОК, я проверял это. Теперь это работает.
Создайте новый проект на основе представления и добавьте веб-представление в xib viewcontroller, используя 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:

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/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...