- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 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)之前已经被触发。
我看到了两种解决此问题的可能性:
如果您有权访问要加载到 UIWebView 中的 HTML,请将 javascript 直接插入到 HTML 中。这保证了当 DOMContentLoaded
被触发时 javascript 已经存在。
如果您无法访问 HTML,您可以直接从 webViewDidFinishLoad:
方法调用您的 DOMReady()
JS 函数(就像您调用inject()
现在)。 DOM 将在此时完全加载。这个选项唯一的不安全之处是,DOM 将被完全加载但可能尚未完全呈现。所以如果你需要某些 DOM 元素的大小,这个选项是不安全的(因为元素可能在那个时候还没有被渲染)。但是,如果您只是在做一些不依赖于完全呈现 DOM 的事情,那么这个选项应该没问题。
关于javascript - DOMContentLoaded 事件未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9722950/
我读了很多关于 jQuery.ready() 的内容。会减慢你的页面速度。我的网站有一堆代码在 jQuery.ready() 内运行正如许多网站所做的那样。 jQuery(document
有什么方法可以手动触发 DOMContentLoaded 事件吗? 我正在尝试为一些客户端 JavaScript 编写单元测试,该测试在 DOMContentLoaded 事件上执行一些操作。 以下方
我在 html 文档中有几个脚本,它们都有一个 DOMContentLoaded 事件监听器。 javaScript 会保持监听器执行的相对顺序还是同步执行它们? 最佳答案 是的,如果您正在使用 ad
我偶然发现了执行此操作的脚本: "complete" === document.readyState ? setTimeout(I, 1) : document.addEventListener ?
我在页面上有一个脚本,该脚本大部分时间都在工作,但并非总是如此,我想知道为什么。 此脚本通过以下方式导入: ` tag in ` 脚本的内容是: console.log("loading"); //
我想尝试 IE 的 javascript DOMContentLoaded 事件。但该事件不会触发。 IE 不支持这个吗?请帮忙解决这个问题。谷歌搜索后我没有找到太多帮助。我想在 javascript
考虑以下场景: Document document.addEventListener("DOMContentLoaded", func
DOMContentLoaded 事件处理程序调用的脚本与在主体末尾调用的脚本有什么区别? 最佳答案 显然,它们在略有不同的上下文中执行 - 内联脚本是“顶级”代码,DOMContentLoaded
例如,这种类型的链式事件将不起作用,因为该事件只会被触发一次。 window.addEventListener('DOMContentLoaded', function () { alert(
我的 html 页面是这样写的: 我的 javascript 文件是这样的: function init(){ audio1 = document.getElementByI
请看代码: body { background: gray; } Firefox does not even shows blank page.
我正在尝试使用 DOMContentLoaded 检测 DOM 何时准备就绪。 我正在将以下 JavaScript 代码注入(inject)页面: var script = document.crea
我用过 Click Not Loading... document.addEventListener('DOMContentLoaded', functio
考虑以下 HTML 文档: Title body { background: crimson; }
我将此代码用于 firefox 扩展 1: var Test { 2: f: function() { 3: alert("DOM content loaded"); 4: window
几个月前我编写了一个 Firefox 附加组件,但最近失败了。该插件主要是查找特定的 URL,然后修改页面的 DOM。我将故障追溯到(意外)安装“AVG Safe Search”附加组件。我发现,在禁
jsfiddle https://jsfiddle.net/ee7oe5pb/2/ Javascript var events = (function () { var fn = {};
我有一个 php 页面需要另一个 php 页面,该页面似乎需要很长时间才能加载,所以我决定有一个加载图像,问题是图像几乎在整个页面加载时出现,而不是在页面 stsrts 时出现正在加载,请问如何解决这
我正在设置一个非常简单的页面来从 DOMContentLoaded 事件上的数组填充下拉列表,但是在我的环境(VS 代码 + 实时服务器扩展)中,我收到错误,因为整个主体对象不存在在 DOMConte
document.addEventListener('DOMContentLoaded', () => { }); 我读到这个事件监听器确保,对于常规脚本,JS 不会引用尚未加载的节点。内容在 DOM
我是一名优秀的程序员,十分优秀!