1

回答:这就是你的做法,因为我无法让以下任何解决方案发挥作用。基本上,您必须使用 javascript,检查文档是否准备就绪,然后将值返回给目标 c。简单优雅。在目标 C 中,webviewdidfinishload:

        NSLog(@"Didload:Check if webview %d loading or loaded", X);
        // The JS File
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"UIWebViewSearch" ofType:@"js" inDirectory:@""];
        NSData *fileData = [NSData dataWithContentsOfFile:filePath];
        NSString *jsString = [[NSMutableString alloc] initWithData:fileData encoding:NSUTF8StringEncoding];
        [webView stringByEvaluatingJavaScriptFromString:jsString];
        NSString *result1 = [webView stringByEvaluatingJavaScriptFromString:@"uiWebview_ReturnDocStatus()"];
        NSLog(@"docread= %@", result1);
        int RREsult = [result1 intValue];
        if (RREsult == 0) {
            NSLog(@"Didload: webview %d not yet loaded", X);
        }
        else if (RREsult == 1){
            NSLog(@"Didload: webView %d loaded", X);
        }

然后,在 javascript 中,在我的 UIWebViewSearch.js 文件中:

function uiWebview_ReturnDocStatus() {
alert ("check");
if(document.readyState == 'complete'){
    return 1;
}
else {
    return 0;
}
}

下面是我的代码。我正在尝试确定我的 Web 视图中是否存在某个元素。我不想使用 document.body 等将整个 html 文本提取到目标 c,因为这会占用太多内存。我想要快点的东西。但以下选项均无效。请帮忙。

NSString *oneString = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('moodlez_documentnotyetloaded').value"];
BOOL test = [webView stringByEvaluatingJavaScriptFromString:@"return !!document.getElementById('moodlez_documentnotyetloaded');"];

编辑1:

这是我的目标 C 代码,后跟 javascript。这段代码在 didfinishload 中。

  if (1 ==1 ) {
    //doesn't work
    NSString *exists = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('moodlez_documentnotyetloaded');"];
    NSLog(@"exists value=%d", [exists intValue]);

}
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"UIWebViewSearch" ofType:@"js" inDirectory:@""];
NSData *fileData = [NSData dataWithContentsOfFile:filePath];
NSString *jsString = [[NSMutableString alloc] initWithData:fileData encoding:NSUTF8StringEncoding];
[webView stringByEvaluatingJavaScriptFromString:jsString];
[webView stringByEvaluatingJavaScriptFromString:@"uiWebview_InjectJSToTellIfLoading()"];

.JS 代码:

 function uiWebview_InjectJSToTellIfLoading() {
  if(document.readyState == 'complete'){
var element = document.createElement('input');
element.setAttribute('type','hidden');
element.setAttribute('id','moodlez_documentloaded');
document.body.appendChild(element);

   }
   else {
if (1 == 1) {
    var element = document.createElement('input');
    element.setAttribute('type','hidden');
    element.setAttribute('id','moodlez_documentnotyetloaded');
    document.body.appendChild(element);
}

} }

编辑2:好的,有两种方法可以解决这个问题。第一种是使用 javascript 从 webview 中获取 html 代码并手动搜索 moodlez 标签。这种方法是不可取的,因为对于大型网页可能需要 1-2 秒,但它确实有效。第二个是创建一个 javascript 函数来检查文档是否准备好,如果是,则修改一个 javascript 变量,然后可以从目标 c 中检查该变量。

4

2 回答 2

1

这是我的目标 C 代码,后跟 javascript。这段代码在 didfinishload 中。

  if (1 ==1 ) {
        //doesn't work
        NSString *exists = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('moodlez_documentnotyetloaded');"];
        NSLog(@"exists value=%d", [exists intValue]);

    }
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"UIWebViewSearch" ofType:@"js" inDirectory:@""];
    NSData *fileData = [NSData dataWithContentsOfFile:filePath];
    NSString *jsString = [[NSMutableString alloc] initWithData:fileData encoding:NSUTF8StringEncoding];
    [webView stringByEvaluatingJavaScriptFromString:jsString];
    [webView stringByEvaluatingJavaScriptFromString:@"uiWebview_InjectJSToTellIfLoading()"];

.JS 代码:

function uiWebview_InjectJSToTellIfLoading() {
if(document.readyState == 'complete'){
    var element = document.createElement('input');
    element.setAttribute('type','hidden');
    element.setAttribute('id','moodlez_documentloaded');
    document.body.appendChild(element);

}
else {
    if (1 == 1) {
        var element = document.createElement('input');
        element.setAttribute('type','hidden');
        element.setAttribute('id','moodlez_documentnotyetloaded');
        document.body.appendChild(element);
    }
}

}

于 2013-03-20T03:39:52.747 回答
0

其实这两种说法都是无效的。

NSString *oneString = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('moodlez_documentnotyetloaded').value"];

您不应该为不存在的元素调用 .value 以防万一它不存在。

BOOL test = [webView stringByEvaluatingJavaScriptFromString:@"return !!document.getElementById('moodlez_documentnotyetloaded');"];

stringByEvaluatingJavaScriptFromString返回 NSString 不是 BOOL

正确的方法可能是这样的

NSString *exists = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('moodlez_documentnotyetloaded');"];

然后检查exists变量的值。

于 2013-03-16T17:06:23.020 回答