回答: 以下の解決策のいずれも機能させることができなかったので、ここにその方法を示します。基本的に、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 変数を変更することです。