Objective C检查元素是不是存在于Web视图中
Posted
技术标签:
【中文标题】Objective C检查元素是不是存在于Web视图中【英文标题】:Objective C check if element exists in web viewObjective C检查元素是否存在于Web视图中 【发布时间】:2013-03-16 16:27:26 【问题描述】:回答:这就是你的做法,因为我无法让以下任何解决方案发挥作用。基本上,您必须使用 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 中检查该变量。
【问题讨论】:
“不起作用”是什么意思?结果是什么?有错误吗? 似乎内联编写 javascript 代码更有意义(在传递 javascript 函数名称的目标 C 语句中)。当您需要处理两个领域的代码时,感觉会变得更难管理。 【参考方案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);
【讨论】:
user2104778,我已将其添加到问题文本中。如果您想添加更多信息,您可以随时编辑您的原始问题。 :) JS 代码将 'moodlez_documentloaded' 元素添加到 DOM。我可以看到你在检查元素是否存在后调用它。我认为您需要在调用“uiWebview_InjectJSToTellIfLoading”之后调用“stringByEvaluatingJavaScriptFromString:@”document.getElementById('moodlez_documentnotyetloaded')”。明白我的意思了吗? 事件的顺序是有意的。订单的原因是我正在检查访问 url 时发生的重定向。例如,用户导航到一个网站,该网站被重定向一次,并且 didfinishload 被调用两次。在第一次注入 moodlez 时未找到任何标签,而在第二次(应该)检测到 moodlez_notyetdownloaded 时,提醒用户该网站已被重定向。 不,当重定向发生时,您的旧 javascript 对象和 html 对象将被删除。 但就像我说的,如果我从 webview 中提取 externalhtml 并手动查找 moodlez 标签,我会找到它,但存在说它不存在?顺便说一句,我简化了我的另一个堆栈溢出问题,如果你有时间,请看看你是否有答案:***.com/questions/15312488/…【参考方案2】:其实这两种说法都是无效的。
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
变量的值。
【讨论】:
我尝试了这个建议,但没有奏效: NSString *exists = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('moodlez_documentnotyetloaded');"]; NSLog(@"exists value=%d", [exists intValue]); 你得到的输出是什么? exists 总是等于 0。 那么 id='moodlez_documentnotyetloaded' 的对象在 DOM 中不存在。 Mohamed 我将在第二天粘贴更多信息,这样您就可以看到我最初是如何注入 moodlez 的。 moodlez 标签肯定在 webview 的某个地方,因为我可以通过在目标 c 中获取外部主体 html 并进行文本搜索来找到它。同时,由于您是 javascript 专业人士,您是否介意在此处查看我的其他紧迫的 javascript 问题:***.com/questions/15312488/…以上是关于Objective C检查元素是不是存在于Web视图中的主要内容,如果未能解决你的问题,请参考以下文章