0

假设我有一些来自网页的数据:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:myurl]];
[request setHTTPMethod:@"GET"];
NSData* returnedData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
NSString* html = [[NSString alloc] initWithData:returnedData encoding:NSUTF8StringEncoding];

我还有一个本地 javascript 脚本,它对数据运行一些查询并修改 DOM。目前,为了实现这一点,我正在使用上面收到的 HTML,创建一个 webview 并将其加载到其中:

[NSString stringWithFormat:@"<script>%@</script>%@", myscript, html];

然后,我在 webview didFinishLoadForFrame 事件上调用

NSString* modifiedhtml = [sender stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"]]

这给我留下了修改后的html,我可以随心所欲地使用它。然而 - 这看起来一点也不优雅,特别是因为只允许在主线程上创建 webviews,并且整个过程理想地会在后台线程中运行,而且,偶尔脚本会抛出错误并且 webview 加载事件不是调用所以我有越来越多的行专门用于处理此事件的超时。总而言之,这是一个丑陋的大烂摊子。

在一个理想的世界里,我会在第一遍应用这个 javascript 而不创建 webview。我一直在尝试各种事情,例如:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:myurl]];
[request setHTTPMethod:@"GET"];
NSData* returnedData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
NSString* html = [[NSString alloc] initWithData:returnedData encoding:NSUTF8StringEncoding];
NSString* modifiedhtml = [request stringByEvaluatingJavaScriptFromString: myscript]];

其中脚本设置为返回页面但无济于事。

有什么建议可以比我现在更优雅、更有效地处理这个问题吗?

4

1 回答 1

-1

为了避免使用 web 视图并假设您的 html 有head标签,您可以执行以下操作:

NSArray *tempArray = [html componentsSeparatedByString:@"<head>"];
NSString *modifiedHtml = [NSString stringWithFormat:@"%@<head>%@%@", [tempArray objectAtIndex:0], yourScriptString, [tempArray objectAtIndex:1]];

它会将您的脚本插入到现有head标签中。您应该使用通常的健全性检查来完成代码。

于 2012-11-23T16:18:36.860 回答