问题标签 [domready]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
4526 浏览

javascript - 为什么推荐 jQuery.ready 这么慢?

我以前也问过类似的问题,但我从来没有把我的观点说得很清楚,或者至少我认为这是一个非常相关的问题,值得提出来看看是否有人能给出一些有见地的想法。

在使用 jQuery 时,我们中的许多人使用该jQuery.ready函数init在 DOM 加载时执行。它已成为使用 jQuery 将 DOM 操作程序添加到网页的事实上的标准方式。一些浏览器本身就存在相关事件,但是 jQuery 在其他浏览器中模拟它,例如一些 IE 版本。例子:

现在,我们所有的测试都表明这个事件可能非常缓慢。它并不像 一样慢window.onload,但在执行之前它仍然经常有大约 100 毫秒的延迟。如果是 FF,它可以达到 200-300 毫秒,尤其是在刷新时。

这是一些非常重要的毫秒,因为这是在进行任何 DOM 操作(例如隐藏下拉菜单)之前显示初始布局的时间量。很多时候,布局“闪烁”主要是由于使用了缓慢的 DOM 就绪事件,迫使程序员使用 CSS 隐藏元素,并可能使其更难访问。

现在,如果我们在关闭 body 标签之前在脚本标签中放置一个 init 函数,它将执行得更快,通常大约是一半时间,但有时甚至更快:

一个证明差异的简单测试页面:http: //jsbin.com/aqifon/10

我的意思是,我们并不是在谈论一些“优化策略”在使用有效选择器时所提倡的几乎不明显的差异。我们正在讨论在加载 DOM 操作时的一些主要延迟。在 FF 中尝试这个示例,domready 有时会慢 100 倍以上(300 毫秒对 2 毫秒)。

现在我的问题是:jQuery.ready当它明显比其他替代品慢得多时,为什么建议使用它?init在关闭 BODY 与 using 之前调用 BODY 的缺点是什么jQuery.ready?可以说使用起来更“安全” domReady,但在什么情况下它比其他选项更安全?(我在考虑类似document.write和延迟脚本之类的东西)我们已经BODY在许多客户网站上使用了近 5 年的方式,我们从未遇到任何问题。它只是快了很多。

我也想知道,既然关于 jsPerf 和每 10000 次执行几毫秒优化选择器的问题太多了,为什么没有太多谈论这个?这基本上是用户面临的第一个延迟,并且在每个页面加载时切片 50-100 毫秒似乎相当简单......

0 投票
2 回答
1115 浏览

javascript - document.write 在等待高延迟脚本加载时在 DOMContentLoaded 之前被忽略

我尝试了许多不同的方法来向谷歌等人提出这个问题,但没有运气。甚至不确定这个问题的标题是否能抓住问题的细微差别。我将尝试解释然后展示实验。我希望有人能够指出发生了什么的一些解释。

鉴于:

  • 在 BODY 结束之前,您有一个脚本 (A),它以编程方式将脚本元素(使用我的首选技术 document.createElement)插入到引用远程脚本 (B) 的文档中
  • 远程脚本 B 执行任何内容的 document.write(例如“hello, world”)
  • 在 BODY 结束之前和脚本 A 之后,您有一个脚本 (C),它引用了一个需要一段时间才能加载的远程脚本(例如 1 秒)

将会发生的是 A 执行,将 B 插入到文档中并开始下载资源。当 B 正在下载时,由于延迟,C 将执行并等待。在 C 等待期间,B 被下载并执行;我们还没有点击 DOMContentLoaded;document.readyState 仍在“加载”中。来自 B 的 document.write 被忽略;狼吞虎咽,好像我们是后 DOMContentLoaded。C 然后完成下载并执行。

实验:

我正在使用 Cuzillion 来制造延迟。如果您查看瀑布图,您还会看到 console.log 消息,它显示所有内容都在 DOM 达到“交互式”就绪状态(即 DOMContentLoaded)之前执行。

我期望在浏览器中的输出是:

我得到的输出是:

您会注意到,在我的实验中,我在定义为 A 和 C 之间添加了另一个脚本。我想将其称为 A';它表明,如果您动态添加包含 document.write 的文本(即不是远程脚本)的脚本,则 A' 中的 doc.write 将起作用。

此外,dummy.js 和 CSS 文件来自 JSFiddle。他们不是罪魁祸首;我可以在任何地方重现这个问题。

我知道的事情:

  • 如果您将 C 替换为 IMG,则没有问题
  • 如果将 C 替换为 IFRAME,则没有问题
  • 如果在 C 之后移动 A,则没有问题

现在:

也许这有一个完全正当的理由。必须有,因为我测试过的所有浏览器似乎都以大致相同的方式运行。我想知道为什么?欢迎任何解释、提示和/或指针。甚至像“它在规范中,愚蠢的:)”这样的提示我的脸皮很厚;我应付得来。

免责声明:我讨厌 document.write。我的意图不是以任何方式支持或支持它的使用。然而,考虑到我工作的性质,我现在必须解决它,这种奇怪的事情突然出现在我身上。因此,我想避免“你不应该使用 document.write”这样的评论,因为我已经相信了:)

0 投票
1 回答
1190 浏览

javascript - 如何等待 LESS JS 加载 .less 文件?

我的网页包含一个less文件而不是css. 这是由lessjs 脚本解析的。我网站的 js 脚本在 dom 就绪时触发,并基于不同的 dom 尺寸布局页面。

问题是,通过慢速网络,我的 js 文件可以在lessjs 能够下载 less文件之前触发。由于这是一个未知的文件类型,所以浏览器没有义务等待这个文件下载然后触发 dom 准备好,即使它在该<head>部分中。在这种情况下,我的 js 读取的尺寸不正确,因为尚未应用 CSS 规则。

所以,我的问题是,我怎么知道less文件何时下载。这样我的 js 代码就可以less在下载并准备好 dom 后被触发。

0 投票
2 回答
2267 浏览

javascript - 如何在信息窗口(Google Maps API v3)中填充下拉列表?

我有两个数组:一个用于文章名称,另一个用于每篇文章的 url 链接。我正在尝试使用文章名称填充信息窗口中的下拉列表,并在选择时链接到每篇文章。

似乎链接可能与使用onchange事件有关,否则我正在使用"domready" eventListener访问<select>元素的 id 标签。

这是我到目前为止的相关代码,但它不起作用

0 投票
3 回答
645 浏览

jquery - jquery函数包装vs dom准备好了

可能重复:
这些 jQuery 就绪函数之间有什么区别?

VS

我在一些旧代码中看到了第一个,我认为两者相似?一个比另一个有好处吗?

0 投票
2 回答
4295 浏览

javascript - DOMContentLoaded 和 DOMContentReady 有什么区别?

根据 MDN wiki, DOMContentLoaded当“页面的 DOM 准备就绪,[尽管] 引用的样式表、图像和子框架可能未完成加载”时将触发。

怎么样DOMContentReady?它只是一个别名吗?

0 投票
1 回答
133 浏览

javascript - 将 JS 分离为多个文件

我的网络项目中有多个页面使用完全相同的 JS 函数。我正在将相同的功能复制并粘贴到所有页面的 js 文件中。common_fns.js但最近将常用函数分离到另一个名为some_page.js. common_fns.js类似的东西

some_page.js

common_fns.js

当我将常用功能复制并粘贴到每个页面的文件时,它正在工作。但现在它没有了:Firebugundefined SelectBoxOptions即使是第一个函数也会显示错误消息。我错过了什么?将相同功能复制粘贴到每个页面的 js 文件中的唯一方法?

0 投票
1 回答
161 浏览

jquery - 为什么 JQuery .ready 函数有时不等待 DOM?

我正在使用 JQuery 来设置一些组合框,并且我已经将 .combobox 调用包装在 .ready 函数中以确保我的控件可用,但是在每 10 次左右加载页面时,用于组合框的元素不是在 DOM 中。发生了什么事,这怎么可能?

我的外部 JavaScript

由于某种原因,我只注意到 IE 中的问题,但这并不是说它在其他浏览器中不存在。

想法?

0 投票
2 回答
6415 浏览

angularjs - angular.js:相当于 domReady

警告:前面有 Angular 新手。

我在 angular.js 页面中有这段代码

然后我将我的控制器定义为:

它工作正常。

我想在 dom 准备好时执行 search() 函数...

我尝试从 $(function() {... 调用它,但我不知道如何从我的控制器手动执行方法

也试过了

但无法使其工作(也找不到太多文档......)

0 投票
5 回答
44392 浏览

javascript - 什么是 DOM 就绪事件?

我需要在收到页面内容(整个 HTML 元素)后立即触发脚本,但还不必渲染它。

我认为只有一个简单的<script>标签在我的页面顶部执行一些代码就可以了?

换个方式来表述这个问题:DOM 就绪是否意味着所有元素和资源都已被拉取和渲染