1

回答: 以下の解決策のいずれも機能させることができなかったので、ここにその方法を示します。基本的に、JavaScript を使用し、ドキュメントの準備ができているかどうかを確認し、目的 c に値を返します。シンプルでエレガント。Objective 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');"];

EDIT1:

ここに、Objective 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: OK、この問題を解決するには 2 つの代替方法があります。1 つ目は、javascript を使用して webview から html コードを取得し、moodlez タグを手動で検索することです。大きな Web ページでは最大 1 ~ 2 秒かかることがあるため、この方法は望ましくありませんが、機能します。2 つ目は、ドキュメントの準備ができているかどうかを確認する JavaScript 関数を作成し、準備ができている場合は、目的 c から確認できる JavaScript 変数を変更することです。

4

2 に答える 2

1

ここに、Objective 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');"];

stringByEvaluatingJavaScriptFromStringBOOLではなくNSStringを返します

適切な方法は次のようなものかもしれません

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

次に、exists変数の値を確認します。

于 2013-03-16T17:06:23.020 に答える