我正在尝试使用DOMContentLoaded检测DOM何时准备就绪。
我将以下JavaScript代码注入到一个页面中:
var script = document.createElement('script');
script.type = 'text/javascript';
script.text = function addListener() {
if (document.addEventListener) {
document.addEventListener("DOMContentLoaded", DOMReady, false);
}
};
function DOMReady() {
document.location.href = "mydomain://anything.stuff";
}
function inject() {
document.getElementsByTagName('head')[0].appendChild(script);
addListener();
}它通过以下方式添加:
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
static BOOL injected = NO;
if (!injected)
{
NSBundle *bundle = [NSBundle mainBundle];
NSURL *jsURL = [bundle URLForResource:@"DetectDOMLoaded" withExtension:@"js"];
NSData *jsData = [NSData dataWithContentsOfURL:jsURL];
NSString *jsScriptAsString = [[NSMutableString alloc] initWithData:jsData encoding:NSUTF8StringEncoding];
[self.webView stringByEvaluatingJavaScriptFromString:jsScriptAsString];
[self.webView stringByEvaluatingJavaScriptFromString:@"inject();"];
injected = YES;
}如果我添加了警报调用,我可以看到对addEventListener的调用正在成功进行。但是,从未调用过DOMReady()函数。有没有什么好主意?
谢谢
发布于 2012-03-18 01:06:43
原因是您在webViewDidFinishLoad:方法中注入了javascript。该方法是在UIWebLoad加载HTML页面后调用的。这意味着在注入javascript之前,DOMContentLoaded事件可能已经被激发了。
我认为有两种方法可以解决这个问题:
DOMContentLoaded,你可以直接从webViewDidFinishLoad:方法调用你的DOMReady() JS函数(就像你现在调用inject()一样)。此时DOM将完全加载。此选项的唯一不安全之处在于,DOM将完全加载,但可能尚未完全呈现。因此,如果您需要某些DOM元素的大小,那么这个选项是不安全的(因为这些元素当时可能还没有被呈现)。但是,如果您只是在做一些不依赖于DOM完全呈现的事情,那么这个选项应该没问题。https://stackoverflow.com/questions/9722950
复制相似问题