Как вызвать функцию 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()"];
Ответы
Ответ 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];