Javascript 使用UIWebView显示和查看日志
我的应用程序正在从web服务中分块检索文本。我正在使用UIWebView显示格式化文本。到目前为止还不错 我的问题是,当每个块到达时,我需要用新内容刷新web视图。我使用KVO来观察文本中的变化,当文本发生变化时,我会调用KVOJavascript 使用UIWebView显示和查看日志,javascript,iphone,objective-c,cocoa-touch,uikit,Javascript,Iphone,Objective C,Cocoa Touch,Uikit,我的应用程序正在从web服务中分块检索文本。我正在使用UIWebView显示格式化文本。到目前为止还不错 我的问题是,当每个块到达时,我需要用新内容刷新web视图。我使用KVO来观察文本中的变化,当文本发生变化时,我会调用KVO [self loadHTMLString:self.log.text baseURL:nil]; 重新显示包含更新文本的页面。不幸的是,这会重新加载整个页面,重置用户的当前位置和缩放 有没有办法请求web视图只刷新文本(假设它保留文本),或者向当前web视图中插入新的
[self loadHTMLString:self.log.text baseURL:nil];
重新显示包含更新文本的页面。不幸的是,这会重新加载整个页面,重置用户的当前位置和缩放
有没有办法请求web视图只刷新文本(假设它保留文本),或者向当前web视图中插入新的next/html?您可以使用
(NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
以及某种类型的javascript函数(比如innerHTML),用于向HTML添加内容
不幸的是,我不是足够的javascript专家,无法为javascript部分提供一个示例。有人吗?好的,根据尼姆罗德的建议,我是这样做的:
//Called on first display. Sets up basic page, and a javascript function to
//next log segments at the end of the a div
- (void) preparePage{
NSString *basePage =
@"<html><body>"
"<script type=\"text/javascript\">"
"function appendMessage(msg) {"
"var msgNode = document.createTextNode(msg);"
"var logNode = document.getElementById(\"log\");"
"logNode.appendChild(msgNode); }"
"</script>"
"<div id=\"log\" style=\"width:80em; white-space:pre-wrap;\"></div>"
"</body></html>";
[self.logView loadHTMLString:basePage baseURL:nil];
[self updateHTMLFromLog];
}
//Called when the log has changed. Keeps track of current position, and inserts
//new segments into the page using the javascript function created in preparePage
- (void) updateHTMLFromLog{
// loop through new log chunks, using Javascript to inject them into the page
while(self.logPosition < [self.log.segments count]){
//escape double quotes to avoid breaking string
NSString *message = [self.log.segments objectAtIndex:self.logPosition] stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
NSString *jsString = [NSString stringWithFormat:@"message = \"%@\";appendMessage(message);", message];
[self.logView stringByEvaluatingJavaScriptFromString:jsString];
++self.logPosition;
}
}
为什么不在刷新内容之前保存当前缩放/位置。在完成加载过程时,您将重置位置并缩放回保存的值。虽然我喜欢您的想法,因为它使模型保持不变,但UIWebView中似乎没有任何方法或属性用于获取或设置缩放和位置。我可以用javascript来实现,但在这种情况下,我也可以按照Nimrod的建议,使用javascript来注入新文本(完全避免重新加载)。我自己对javascript了解不多,但我身边有一些人是这样做的。我必须对我的模型进行一些修改,以使其发挥作用,但无论如何,它可能会变得更好。当你发现它是什么时,请将其作为评论发布在这里。我很想知道,因为我可能会在某个时候使用它。我已经在下面的答案中发布了我的代码,只做了一些小的修改。
function appendMessage(msg) {
var msgNode = document.createElement('div');
msgNode.innerHTML = msg;
var logNode = document.getElementById('log');
logNode.appendChild(msgNode);
}