javascript document.ready什么时候运行,内联JS什么时候处理?

bvhaajcl  于 2022-12-25  发布在  Java
关注(0)|答案(4)|浏览(125)

我有一个页面,在<head>部分导入了我的大部分js,但是主页面有一些内联JavaScript。
在我导入到<head>中的一个脚本中,我有一个$(document).ready...,它使用了一些在页面上内联定义的JS变量。就我所见,这和我所期望的一样--$(document).ready使用内联定义的JS变量时没有遇到任何错误。
然而,我从用户那里得到一些报告,他们在我的$(document).ready中的代码中看到“未定义”错误,我引用了在页面上内联定义的变量。
我怀疑这是浏览器特有的行为,但我不确定。我没有在文档中明确找到这一点,所以有人能确认在从<head>拉入的JS中使用$(document).ready页面上内联定义的变量是可以的吗?
引用你的消息来源会让你的答案更可信。:)

aij0ehis

aij0ehis1#

    • 发动机罩下:$(文档). ready()**

正如您从John Resig那里所期望的那样,jQuery用于确定DOM何时准备就绪的方法使用了各种各样的优化。
例如,如果浏览器支持DOMContentLoaded事件(许多非IE浏览器都支持),那么它将在该事件发生时触发。然而,IE不能安全地触发,直到文档的readyState达到"complete",这通常更晚。
如果这些优化都不可用,window.onload将触发事件
来源:here

djmepvbi

djmepvbi2#

为什么不在启动应用程序的“body”标签的末尾放置一个“script”标签呢?
通过这样做,您可以确保一切就绪,可以开始(跨浏览器和跨库)。

<html>
  ...
  <script>startApp('param');</script>
</body>
</html>

“startApp”是之前任何地方定义的函数,可以是内联函数,也可以是“head”标记中的函数。

whlutmcx

whlutmcx3#

$(document).ready()针对不同的浏览器使用了各种不同的方法。对于如何处理此事件,没有太多的浏览器达成一致,因此有许多方法可以测试它。我非常肯定jQuery实现,至少IE hack,取决于插入一个片段并检查它的doScroll("left")属性,该属性只应在DOM准备就绪时存在。这是一个未记录的行为,可能会随着IE的更新版本而改变。
$(document).ready()的用途是允许您在页面加载完成之前运行DOM相关的JavaScript,因为window.onload在整个页面加载完成之前不会触发。
不同的实现也有不同的可靠性级别。听起来像是其中一个浏览器在完成加载之前就启动了脚本。
请记住,内联JavaScript的触发顺序不一定在ready之前,我认为您应该将内联脚本合并到$(document).ready()回调中。jQuery做得最好,但并不完美。

u3r8eeie

u3r8eeie4#

在事件触发之前,您的内联JS可能不会被处理,因为不同的浏览器会有不同的工作方式。您可以假设您的ready函数会尽快启动,但无法确切知道它何时启动。
您不应该假设ready函数会很快启动,因此您可能需要编写内联逻辑来等待该函数运行。
在javascript中,对事情何时发生的假设进行编码是有风险的,就像假设你想使用的属性或函数存在一样,所以你需要非常谨慎地进行编码。
您可能希望将内联javascript放入函数中,并从ready函数中调用它,或者至少翻转一些标志,让内联代码知道它现在可以安全运行了。
这很有可能会让你延迟一点,但我希望这会带来更好的用户体验。

相关问题