问题标签 [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.
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 毫秒似乎相当简单......
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 然后完成下载并执行。
实验:
- 来源:http: //jsfiddle.net/jaknowlden/pwHG8/
- 直接试用:http: //jsfiddle.net/jaknowlden/pwHG8/show/
- 瀑布:手动链接[cl.ly/423P2M1d0r0e0k3h370g]
- 远程脚本:手动链接[thumblemonks.com/js/stackoverflow-script-b.js]
我正在使用 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”这样的评论,因为我已经相信了:)
javascript - 如何等待 LESS JS 加载 .less 文件?
我的网页包含一个less
文件而不是css
. 这是由less
js 脚本解析的。我网站的 js 脚本在 dom 就绪时触发,并基于不同的 dom 尺寸布局页面。
问题是,通过慢速网络,我的 js 文件可以在less
js 能够下载 less
文件之前触发。由于这是一个未知的文件类型,所以浏览器没有义务等待这个文件下载然后触发 dom 准备好,即使它在该<head>
部分中。在这种情况下,我的 js 读取的尺寸不正确,因为尚未应用 CSS 规则。
所以,我的问题是,我怎么知道less
文件何时下载。这样我的 js 代码就可以less
在下载并准备好 dom 后被触发。
javascript - 如何在信息窗口(Google Maps API v3)中填充下拉列表?
我有两个数组:一个用于文章名称,另一个用于每篇文章的 url 链接。我正在尝试使用文章名称填充信息窗口中的下拉列表,并在选择时链接到每篇文章。
似乎链接可能与使用onchange
事件有关,否则我正在使用"domready" eventListener
访问<select>
元素的 id 标签。
这是我到目前为止的相关代码,但它不起作用:
javascript - DOMContentLoaded 和 DOMContentReady 有什么区别?
根据 MDN wiki, DOMContentLoaded
当“页面的 DOM 准备就绪,[尽管] 引用的样式表、图像和子框架可能未完成加载”时将触发。
怎么样DOMContentReady
?它只是一个别名吗?
javascript - 将 JS 分离为多个文件
我的网络项目中有多个页面使用完全相同的 JS 函数。我正在将相同的功能复制并粘贴到所有页面的 js 文件中。common_fns.js
但最近将常用函数分离到另一个名为some_page.js
. common_fns.js
类似的东西
some_page.js
common_fns.js
当我将常用功能复制并粘贴到每个页面的文件时,它正在工作。但现在它没有了:Firebugundefined SelectBoxOptions
即使是第一个函数也会显示错误消息。我错过了什么?将相同功能复制粘贴到每个页面的 js 文件中的唯一方法?
jquery - 为什么 JQuery .ready 函数有时不等待 DOM?
我正在使用 JQuery 来设置一些组合框,并且我已经将 .combobox 调用包装在 .ready 函数中以确保我的控件可用,但是在每 10 次左右加载页面时,用于组合框的元素不是在 DOM 中。发生了什么事,这怎么可能?
我的外部 JavaScript
由于某种原因,我只注意到 IE 中的问题,但这并不是说它在其他浏览器中不存在。
想法?
angularjs - angular.js:相当于 domReady
警告:前面有 Angular 新手。
我在 angular.js 页面中有这段代码
然后我将我的控制器定义为:
它工作正常。
我想在 dom 准备好时执行 search() 函数...
我尝试从 $(function() {... 调用它,但我不知道如何从我的控制器手动执行方法
也试过了
但无法使其工作(也找不到太多文档......)
javascript - 什么是 DOM 就绪事件?
我需要在收到页面内容(整个 HTML 元素)后立即触发脚本,但还不必渲染它。
我认为只有一个简单的<script>
标签在我的页面顶部执行一些代码就可以了?
换个方式来表述这个问题:DOM 就绪是否意味着所有元素和资源都已被拉取和渲染?