gpt4 book ai didi

javascript - DOMContentLoaded 事件未触发

转载 作者:可可西里 更新时间:2023-11-01 03:13:46 24 4
gpt4 key购买 nike

我正在尝试使用 DOMContentLoaded 检测 DOM 何时准备就绪。

我正在将以下 JavaScript 代码注入(inject)页面:

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() 从未被调用过。有什么想法为什么不呢?

谢谢

最佳答案

原因是您在 webViewDidFinishLoad: 方法中注入(inject)了 javascript。该方法在 UIWebLoad 加载 HTML 页面后调用。这意味着 DOMContentLoaded 事件可能在您的 javascript 被注入(inject)之前已经被触发。

我看到了两种解决此问题的可能性:

  1. 如果您有权访问要加载到 UIWebView 中的 HTML,请将 javascript 直接插入到 HTML 中。这保证了当 DOMContentLoaded 被触发时 javascript 已经存在。

  2. 如果您无法访问 HTML,您可以直接从 webViewDidFinishLoad: 方法调用您的 DOMReady() JS 函数(就像您调用inject() 现在)。 DOM 将在此时完全加载。这个选项唯一的不安全之处是,DOM 将被完全加载但可能尚未完全呈现。所以如果你需要某些 DOM 元素的大小,这个选项是不安全的(因为元素可能在那个时候还没有被渲染)。但是,如果您只是在做一些不依赖于完全呈现 DOM 的事情,那么这个选项应该没问题。

关于javascript - DOMContentLoaded 事件未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9722950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com