告诉 stringByEvaluatingJavaScriptFromString: 何时完成
Tell when stringByEvaluatingJavaScriptFromString: has completed
我使用的是标准 UIWebView
,需要知道 stringByEvaluatingJavaScriptFromString:
何时完成。我知道 WKWebView
有一个完成处理程序,但我需要使用我得到的当前 UIWebView
。由于该方法需要在主线程上 运行 GCD 没有太大帮助。有什么建议么?
-(void)insertValue:(NSString*)value inWebView:(UIWebView*)webView{
NSString *jsString = [NSString stringWithFormat:kConstantJSString, value];
[webView stringByEvaluatingJavaScriptFromString: jsString];
NSLog("THIS SHOULD LOG WHEN JS HAS EXECUTED");
}
好的,所以我想出了一个很好的方法来做到这一点。
在您的 javascript 调用中,将此行添加到脚本的末尾:
window.location = 'js-ObjC:jsCompleted';
然后使用 UIWebView 的 shouldStartLoadWithRequest: 方法来捕获和测试这个新的 window 位置。然后我在新的 window 位置调用了一个选择器,其中包含第二个组件的名称。
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
if ([[[request URL] absoluteString] hasPrefix:@"js-ObjC:"]) { //get location change
NSArray *components = [[[request URL]absoluteString] componentsSeparatedByString:@":"];
NSString *functionName = [components objectAtIndex:1];
/* Calls selector for functionName, this way silences compiler warning */
SEL selector = NSSelectorFromString(functionName);
((void (*)(id, SEL))[self methodForSelector:selector])(self, selector);
return NO;
}
return YES;
}
-(void)jsCompleted{
//Do stuff after javascript has completed
}
我使用的是标准 UIWebView
,需要知道 stringByEvaluatingJavaScriptFromString:
何时完成。我知道 WKWebView
有一个完成处理程序,但我需要使用我得到的当前 UIWebView
。由于该方法需要在主线程上 运行 GCD 没有太大帮助。有什么建议么?
-(void)insertValue:(NSString*)value inWebView:(UIWebView*)webView{
NSString *jsString = [NSString stringWithFormat:kConstantJSString, value];
[webView stringByEvaluatingJavaScriptFromString: jsString];
NSLog("THIS SHOULD LOG WHEN JS HAS EXECUTED");
}
好的,所以我想出了一个很好的方法来做到这一点。 在您的 javascript 调用中,将此行添加到脚本的末尾:
window.location = 'js-ObjC:jsCompleted';
然后使用 UIWebView 的 shouldStartLoadWithRequest: 方法来捕获和测试这个新的 window 位置。然后我在新的 window 位置调用了一个选择器,其中包含第二个组件的名称。
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
if ([[[request URL] absoluteString] hasPrefix:@"js-ObjC:"]) { //get location change
NSArray *components = [[[request URL]absoluteString] componentsSeparatedByString:@":"];
NSString *functionName = [components objectAtIndex:1];
/* Calls selector for functionName, this way silences compiler warning */
SEL selector = NSSelectorFromString(functionName);
((void (*)(id, SEL))[self methodForSelector:selector])(self, selector);
return NO;
}
return YES;
}
-(void)jsCompleted{
//Do stuff after javascript has completed
}