Cocoa:发出url数据请求,运行本地DOM更改javascript,存储修改后的html



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

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,创建一个网络视图并将其加载到其中:

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

然后,我在网络视图didFinishLoadForFrame事件上调用

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

这给我留下了修改后的html,我可以随心所欲地使用它。然而,这似乎一点也不优雅,尤其是因为创建网络视图只允许在主线程上进行,而整个过程最好在后台线程中运行,而且,偶尔脚本会抛出错误,并且不会调用网络视图加载事件,所以我有越来越多的行专门用于处理这种情况下的超时。总而言之,这是一个丑陋的大混乱。

在理想的情况下,我会在第一次通过时应用这个javascript,而根本不创建网络视图。我一直在尝试各种各样的东西,比如:

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]];

其中脚本被设置为返回页面但无效。

对于如何比我目前更优雅、更高效地处理这件事,有什么建议吗?

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

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

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

最新更新