web-dev-qa-db-ja.com

UIWebViewを使用してJavascriptを呼び出す

関数を使用してhtmlページでjavascriptを呼び出そうとしています-

_View did load function
{

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writablePath = [documentsDirectory stringByAppendingPathComponent:@"BasicGraph.html"];
    NSURL *urlStr = [NSURL fileURLWithPath:writablePath];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *myPathInfo = [[NSBundle mainBundle] pathForResource:@"BasicGraph" ofType:@"html"];
    [fileManager copyItemAtPath:myPathInfo toPath:writablePath error:NULL];

    [graphView loadRequest:[NSURLRequest requestWithURL:urlStr]];
}

- (void) webViewDidFinishLoad:(UIWebView *)webView
{
    [graphView stringByEvaluatingJavaScriptFromString:@"methodName()"];
}
_

これがhtmlページのjavascriptです-

_<script>
    function methodName()
      {
         // code to draw graph
      }
_

ただし、関数methodName()は呼び出されませんが、window.onload = function()の後はすべて正常に機能しています。

RGraphs をアプリケーションに統合しようとしています。_Basic.html_は、javascriptが記述されているhtmlページです。

誰かがこれで私を助けることができたら素晴らしいでしょう。

36
learner2010

シンプル:ページがロードされる前に、Objective-CからJS関数を実行しようとします。

UIViewControllerで IWebViewのデリゲートメソッド _webViewDidFinishLoad:_を実装し、そこで[graphView stringByEvaluatingJavaScriptFromString:@"methodName()"];を呼び出して、関数が呼び出されることを確認しますafterページがロードされました。

68
Björn Kaiser

もう少し明確にするために。

.h-UIWebViewDelegateを実装します

@interface YourViewController : UIViewController <UIWebViewDelegate>
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@end

.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *path = @"http://www.google.com";
    [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:path]]];
    _webView.delegate = self; //Set the webviews delegate to this
}

- (void) webViewDidFinishLoad:(UIWebView *)webView
{
    //Execute javascript method or pure javascript if needed
    [_webView stringByEvaluatingJavaScriptFromString:@"methodName();"];
}

コードでデリゲートを行う代わりに、ストーリーボードからデリゲートを割り当てることもできます。

10
Kalel Wade