Подтвердить что ты не робот

Как вызвать функцию JavaScript в объекте C

Я новый программист для цели C. Я добавил некоторый html файл в Objective C. В этом html файле содержится простая функция javascript. Мне нужно вызвать эту функцию через целевой код C. Я много времени пробовал с помощью Google. Но я не мог найти настоящего способа сделать это.  Bellow содержит файл html:

<!DOCTYPE html>
<html>
    <head>
        <script>
            function myFunction()
            {
                alert("Hello World!");
            }
            </script>
    </head>

    <body>
        <button onclick="myFunction()">Try it</button>
    </body>
</html>

Я вызвал эту функцию следующим образом: Правильно или неправильно? Если это неправильно, как это сделать. Пожалуйста помоги.

NSString *path;
NSBundle *thisBundle = [NSBundle mainBundle];
path = [thisBundle pathForResource:@"first" ofType:@"html"];
NSURL *instructionsURL = [NSURL fileURLWithPath:path];
[webView loadRequest:[NSURLRequest requestWithURL:instructionsURL]];

 NSString * jsCallBack = [NSString stringWithFormat:@"myFunction()"];
 [webView stringByEvaluatingJavaScriptFromString:jsCallBack];

[webView stringByEvaluatingJavaScriptFromString:@"myFunction()"];
4b9b3361

Ответ 1

NSString *path;
NSBundle *thisBundle = [NSBundle mainBundle];
path = [thisBundle pathForResource:@"first" ofType:@"html"];
NSURL *instructionsURL = [NSURL fileURLWithPath:path];
[webView loadRequest:[NSURLRequest requestWithURL:instructionsURL]];

 NSString * jsCallBack = [NSString stringWithFormat:@"myFunction()"];
 [webView stringByEvaluatingJavaScriptFromString:jsCallBack];

[webView stringByEvaluatingJavaScriptFromString:@"myFunction()"];

Если весь этот код вызывается из одного места, то он не будет работать, потому что загрузка страницы асинхронна, а страница с кодом JavaScript в данный момент не готова. Попробуйте вызвать эти методы [webView stringByEvaluatingJavaScriptFromString:@"myFunction()"]; в методе обратного вызова UIWebViewDelegate –webViewDidFinishLoad:

Ответ 2

<!DOCTYPE html>
<html>
<head>

    <script type="text/javascript" charset="utf-8" src="your.js"></script>
    <script type="text/javascript" charset="utf-8" src="andYourJsfileName.js"></script>

    <script>
        function myFunction('yourParameter') 
        {
            // do your javascript operation

            //alert("my Hello World!");
            return value;
        }

    </script>
</head>

<body>
    <!--button onclick="myFunction()">Try it</button-->
</body>

Добавьте файл html в папку проекта. Добавьте файл javascript также в папку проекта.

После добавления html файла и этого нативного кода в ваш viewController.m

-(void)loadMyWebView {
    webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 100, 200)];
    NSString *path;
    NSBundle *thisBundle = [NSBundle mainBundle];
    path = [thisBundle pathForResource:@"first" ofType:@"html"];
    NSURL *instructionsURL = [NSURL fileURLWithPath:path];

    NSString* htmlString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

    webView.delegate=self;

    [webView loadHTMLString:htmlString baseURL:instructionsURL];
    // [self.view addSubview:webView];  (if you want to access the javascript function and don't want to add webview, you can skip that also.)
}


- (void)webViewDidFinishLoad:(UIWebView*)theWebView {
    NSString* returnValue =[theWebView stringByEvaluatingJavaScriptFromString:@"myFunction('pass your parameter')"];
    NSLog(@"returnValue = %@ ",returnValue);
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{

    NSLog(@" didFailLoadWithError");
}

Вызвать это в методе didLoad [self loadMyWebView];

Здесь вы можете добавить любой javascript файл в проект и включить его в html файл. Вы можете вызвать функцию javascript внутри тега. (точно так же, как вы использовали для вызова js-функций.)

Вы можете передать любой параметр функции javascript и вернуть что-либо объективной функции.

Запомнить: После добавления всего js файла не забудьте добавить их в Ресурсы копирования ресурсов

Чтобы избежать предупреждения: удалите их из Источники компиляции

Ответ 3

Можно использовать фреймворк JavaScriptCore для запуска кода JavaScript из Objective-C.

#import <JavaScriptCore/JavaScriptCore.h>

...

JSContext *context = [[JSContext alloc] init];
[context evaluateScript: @"function greet(name){ return 'Hello, ' + name; }"];
JSValue *function = context[@"greet"];
JSValue* result = [function callWithArguments:@[@"World"]];
[result toString]; // -> Hello, World

Вот демо:

https://github.com/evgenyneu/ios-javascriptcore-demo

Ответ 4

FileName.js:

function greet() {
    hello("This is Javascript function!");
}

Скопируйте этот файл в ресурсы Bundle.

Теперь #import <JavaScriptCore/JavaScriptCore.h> в файле заголовка

 @property (nonatomic,strong) JSContext *context; // Declare this in header file

       // This code block goes into main file
        NSString *scriptPath = [[NSBundle mainBundle] pathForResource:@"FileName" ofType:@"js"];
        NSString *scriptString = [NSString stringWithContentsOfFile:scriptPath encoding:NSUTF8StringEncoding error:nil];

        self.context = [[JSContext alloc] init];
        [self.context evaluateScript:scriptString];

        self.context[@"hello"] = ^(NSString text) {
            NSLog(@"JS : %@",text);
        }

        JSValue *function = self.context[@"greet"];
        [function callWithArguments:@[]];

Этот блок кода работал у меня. Он отображает "Это функция Javascript!" в консоли. Надеюсь, это сработает!

Ответ 5

Попробуйте следующее:

NSString *jsCallBack = [NSString stringWithFormat:@"setPhoto('%@')",profileImgPath];

[webView stringByEvaluatingJavaScriptFromString:jsCallBack];