stringByEvaluatingJavaScriptFromString问题

时间:2011-07-14 20:36:37

标签: javascript html objective-c string file

我正在尝试使用这行代码

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

但它不起作用。我有多个javascript文件,我不知道如何告诉程序我正在尝试使用哪一个。这些文件是从本地html文件加载的。如果有人知道我会如何真正地欣赏它,或者有人知道另一种使用目标c的方式来调用javascript。

由于 克林顿

2 个答案:

答案 0 :(得分:3)

很有可能在加载HTML之前尝试运行此命令。即使文件是本地文件,WebView也会异步加载。在尝试使用嵌入式JavaScript之前,您需要实现WebFrameLoadDelegate并等待webView:didFinishLoadForFrame:

答案 1 :(得分:0)

您发布的代码:

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

是对的。我唯一能想到你问题的原因是由于某种原因,没有加载包含test函数的javascript文件。

试试这个:

NSString* result = [webView stringByEvaluatingJavaScriptFromString:@"document.title;"];

并查看您是否获得result中的值。

编辑:

如果要加载包含对本地javascript文件的引用的本地HTML文件,那么最有可能导致您的错误行为的原因是,在初始化baseURL时未指定UIWebView,例如:

- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL

这应该允许您正确加载资源文件夹中可用的javascript文件:

NSString* basePath = [[NSBundle mainBundle] bundlePath];
[_label loadHTMLString:htmlString baseURL:[NSURL fileURLWithPath:basePath]];

如果您提供有关HTML / javascript文件组织方式的更多详细信息,我可以帮助您进一步解决这个问题(如果我的假设是正确的)。

编辑2:

(在下文中,我假设您使用的是MacOS,但我意识到这里没有任何说明;如果它适用于iOS,类似的推理会适用,但细节会有所不同)

首先,您的委托方法webView:didFinishLoadForFrame:是否被调用?或者是–webView:didFailLoadWithError:forFrame:被叫?

如另一个答案所述,您只能在加载webView后执行javascript

另一方面,我很确定你没有正确传递baseURL

 NSString *htmlPath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"allFiles"]; 
 htmlData = [NSData dataWithContentsOfFile:htmlPath]; 
 [webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:htmlPath]];

在此代码段中,baseURL是您的<prefix>/allFiles/index.html文件;你应该简单地为<prefix>/allFiles传递baseURL,如果其余的都是正确的(意思是didFinishLoad的东西,并且html文件引用脚本以及脚本目录的相对路径)它应该工作。

现在,我无法建议一种方法来正确找到目录“allFiles”的路径(这里很晚),但只是为了进行测试,您可以修剪当前的htmlPath以从中删除“ index.html“substring ...