我应该使用哪种方法注入javascript?(stringByEvaluatingJavaScriptFromString)

我应该使用哪种方法注入javascript?(stringByEvaluatingJavaScriptFromString),javascript,objective-c,ios,uiwebview,Javascript,Objective C,Ios,Uiwebview,我已经创建了一个IOS应用程序 应用程序具有MainViewController,它将从webViewController显示/取消模式视图 nib文件(包含导航栏和UIWebView)。我想在UIWebView加载的每个网页中插入javascript函数,这些函数将在网页中调用,这意味着所有函数都必须在页面完成加载之前完成加载 我尝试了很多方法,但当ModalView再次出现时(第一次出现时工作正常)。页面不知道我的注入函数 所以我的问题是: 如果ModalView出现时UIWebView加

我已经创建了一个IOS应用程序

应用程序具有MainViewController,它将从webViewController显示/取消模式视图 nib文件(包含导航栏和UIWebView)。我想在UIWebView加载的每个网页中插入javascript函数,这些函数将在网页中调用,这意味着所有函数都必须在页面完成加载之前完成加载

我尝试了很多方法,但当ModalView再次出现时(第一次出现时工作正常)。页面不知道我的注入函数

所以我的问题是:

  • 如果ModalView出现时UIWebView加载请求,我应该在哪里注入javascript?在请求之前?你有没有吃东西?完成了吗
  • 当关闭ModalView时,我应该如何处理UIWebView?加载关于:空白请求
感谢您的阅读和任何帮助/建议。:)

如果ModalView出现时UIWebView加载请求,我应该在哪里注入javascript?在请求之前?你有没有吃东西?完成了吗

webViewDidFinishLoad:
中。在此之前,您不能调用
stringByEvaluatingJavaScriptFromString:
。不幸的是,如果不显示web视图,就无法达到这一点,如果JavaScript更改过多,有时会导致视图“闪烁”。有时我会在web视图上放置一个额外的视图来隐藏它,直到
webViewDidFinishLoad:
完成

当关闭ModalView时,我应该如何处理UIWebView?加载关于:空白请求

没什么。应在释放模态视图时释放它

如果ModalView出现时UIWebView加载请求,我应该在哪里注入javascript?在请求之前?你有没有吃东西?完成了吗

webViewDidFinishLoad:
中。在此之前,您不能调用
stringByEvaluatingJavaScriptFromString:
。不幸的是,如果不显示web视图,就无法达到这一点,如果JavaScript更改过多,有时会导致视图“闪烁”。有时我会在web视图上放置一个额外的视图来隐藏它,直到
webViewDidFinishLoad:
完成

当关闭ModalView时,我应该如何处理UIWebView?加载关于:空白请求

没什么。应在释放模态视图时释放它

如果ModalView出现时UIWebView加载请求,我应该在哪里注入javascript?在请求之前?你有没有吃东西?完成了吗

我猜在您的情况下,如果用户单击一些目标链接或html元素,那么mainViewController将使用presentModalView方法显示,对吗?(如果不是,请纠正我)
如上所述,您可以像这样在
UIWebviewDelegate
中调用javascript

-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType 
{
     NSString *url = [[inRequest URL] absoluteString];

     /* separate your href string such as href="doMyFunction?presentView" */
     NSArray *comp1 = [url componentsSeparatedByString:@"?"];
     NSString * checker = [comp1 objectAtIndex:1];
     if([checker isEqualToString:@"presentView"])
     {
         // do my code
     }
}
当关闭ModalView时,我应该如何处理UIWebView?加载关于:空白请求

您的MainView已经覆盖了UIWebview,因此它取决于您的目的,如

  • 改变一些信息
  • 隐藏一些组件
  • 什么都不要做
希望它能帮助你

如果ModalView出现时UIWebView加载请求,我应该在哪里注入javascript?在请求之前?你有没有吃东西?完成了吗

我猜在您的情况下,如果用户单击一些目标链接或html元素,那么mainViewController将使用presentModalView方法显示,对吗?(如果不是,请纠正我)
如上所述,您可以像这样在
UIWebviewDelegate
中调用javascript

-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType 
{
     NSString *url = [[inRequest URL] absoluteString];

     /* separate your href string such as href="doMyFunction?presentView" */
     NSArray *comp1 = [url componentsSeparatedByString:@"?"];
     NSString * checker = [comp1 objectAtIndex:1];
     if([checker isEqualToString:@"presentView"])
     {
         // do my code
     }
}
当关闭ModalView时,我应该如何处理UIWebView?加载关于:空白请求

您的MainView已经覆盖了UIWebview,因此它取决于您的目的,如

  • 改变一些信息
  • 隐藏一些组件
  • 什么都不要做

希望它能帮助你

谢谢Rob:),我会试试。我只是担心网页会在注入之前调用这些函数,这会使js崩溃。使用
stringByEvaluatingJavaScriptFromString:
无法完全修复此问题。onload事件将在您运行任何内容之前触发。如果您必须在onload之前注入代码,那么您必须在下载的过程中修改HTML本身。你可以用NSURLProtocol做到这一点,但是修改任意HTML总是很危险的。谢谢Rob:),我会试试。我只是担心网页会在注入之前调用这些函数,这会使js崩溃。使用
stringByEvaluatingJavaScriptFromString:
无法完全解决这个问题。onload事件将在您运行任何内容之前触发。如果您必须在onload之前注入代码,那么您必须在下载的过程中修改HTML本身。您可以使用NSURLProtocol实现这一点,但是修改任意HTML总是很危险的。