相关疑难解决方法(0)

加载并执行脚本的顺序

有很多不同的方法可以在html页面中包含JavaScript.我知道以下选项:

  • 内联代码或从外部URI加载
  • 包括在<HEAD>或<body>标记[ 1,2 ]
  • 没有deferasync属性(只有外部脚本)
  • 包含在静态源中或由其他脚本动态添加(在不同的解析状态,使用不同的方法)

不计算来自硬盘,javascript:URIs和onEvent-attributes [ 3 ]的浏览器脚本,已经有16个替代方法可以执行JS,我确信我忘了一些东西.

我不太关心快速(并行)加载,我对执行顺序更感兴趣(这可能取决于加载顺序和文档顺序).是否有一个很好的(跨浏览器)参考,涵盖所有情况?例如http://www.websiteoptimization.com/speed/tweak/defer/仅处理其中的6个,并且主要测试旧浏览器.

我担心没有,这是我的具体问题:我有一些(外部)头脚本用于初始化和脚本加载.然后我在身体的末尾有两个静态的内联脚本.第一个允许脚本加载器动态地将另一个脚本元素(引用外部js)附加到正文.第二个静态内联脚本想要使用添加的外部脚本中的js.它可以依赖于已执行的其他(以及为什么:-)?

javascript load-order

248
推荐指数
4
解决办法
20万
查看次数

您可以在HTML脚本标记上同时使用async和defer属性吗?

我想同时使用下面的JavaScript代码来加载deferasync:

<script defer async src="/js/somescript.js"></script>

由于deferInternet Explorer 5.5+支持,正如您在CanIUse.com上看到的,如果异步不可用,我希望优先使用延迟.Async我认为最好在可用时使用,但在Internet Explorer 10之前不支持.

我的问题是上面的代码是否有效HTML?如果没有,是否有可能使用JavaScript优雅地回退到不可用defer的脚本时创建这种情况async

javascript html5 asynchronous

60
推荐指数
5
解决办法
1万
查看次数

异步和文档就绪

我尝试通过async在脚本上添加一些属性来优化我的页面.它似乎打破了我的javascript,因为$(document).ready在加载所有脚本之前执行!

我看到我可以通过$(window).load代替而解决我的问题,$(document).ready但我想知道是否有更好的解决方案.此解决方案在我的情况下触发2个问题:

  1. 我必须改变所有$(document).ready并告诉所有开发人员不再使用它
  2. 加载所有图像后将执行脚本.我的网站有很多沉重的图像,我真的需要一些脚本在dom准备好后尽快执行.

你有一些魔术吗?也许把所有脚本放在最后?用defer而不是async

html jquery html5

33
推荐指数
2
解决办法
2万
查看次数

有没有理由不使用<script defer> TODAY?

曾几何时,有很多激烈的争论<script><head><body>.

许多SO帖子已经指出了最佳实践/经验法则<script><body>不阻止html解析器之前放置前端,从而更快地获得第一次屏幕绘制和更快的客户端DOM访问,从而获得更好的用户体验.

这必须是重复的("□")╯

等等...... 现在<script>可以deferred,实际上已经有一段时间了!

老帖说

延迟脚本可能会导致JS依赖问题

不,它不会.它在解析DOM时立即保留执行顺序.

它不适用于跨供应商

是的,它曾经是,但今天它几乎得到了所有主要浏览器供应商的支持:http://caniuse.com/#search=defer,除了评论指出IE <10之外可能还有一些问题.

然而,它提供的好处似乎是显而易见的,至少在我看来,因为它在早期(在开始解析DOM之前)并行下载脚本,因此不需要稍后请求脚本并缩短整个脚本所需的时间.页面互动.

简而言之,这个问题类似于:任何不使用的好理由

<head>
...
<script src='cdn/to/jquery' defer>
<script src='cdn/to/bootstrap' defer>
<script src='script/depends/on/jqueryandbootstrap' defer>
</head>
Run Code Online (Sandbox Code Playgroud)

而是使用这个:

<body>
...
<script src='cdn/to/jquery'>
<script src='cdn/to/bootstrap'>
<script src='script/depends/on/jqueryandbootstrap'>
</body>
Run Code Online (Sandbox Code Playgroud)

注意:这可能是一个有很多讨论的"古老"话题.但是,随着Web技术的快速发展,浏览器供应商更好地与新的Web规范保持一致,许多旧的stackoverflow答案可能无法保持最新​​.

javascript html5 external-script deferred-loading

15
推荐指数
1
解决办法
1720
查看次数

为什么我需要加载JavaScript模块,所有这些加载器之间有什么区别?

问题1:

为什么我需要在网页中异步加载我的JavaScript文件?我可以在服务器端看到它的基本原理,但如果我知道我需要在客户端加载的所有文件,为什么我不应该将所有源文件连接成1个文件并在页面加载时加载?第一个初始页面加载是否如此重要,以至于由于检索每个JS文件的延迟而导致未来的操作可能会变慢?

问题2:

假设问题1的答案是我需要单独加载JS文件:

AMD异步加载每个JS文件,CommonJS同步加载.服务器端加载需要CJS(如果我没有弄错的话,这就是Node.js的工作方式).AMD似乎更适合客户.因此,在客户端中使用CJS的唯一原因是与服务器共享代码.

有没有办法让AMD和CJS发挥得很好,以便客户端JS文件可以异步加载但仍然具有CJS语法?

(究竟是什么require.js呢?我不能为我的生活在他们的网站上的线条之间阅读.)

javascript amd commonjs

8
推荐指数
1
解决办法
1989
查看次数

扩展Google Maps API v3类的最佳方式

可以扩展Google Maps API v3中的许多类,特别是google.maps.MVCObjectgoogle.maps.OverlayView.

在一些示例中,它们将在回调函数中扩展一个类initMap.我的应用程序比这些示例更强大,并且不希望在回调函数中定义一堆类.

(A)的解决方案是否在我自己的脚本之前包含Google Maps API而不包含回调函数?或者(B)我只是在回调函数中定义所有内容吗?或(C)其他一些方法.

选项A.

<script src="https://maps.googleapis.com/maps/api/js?key=API_KEY"></script>
<script src="./assets/js/main.js" type="module"></script>
Run Code Online (Sandbox Code Playgroud)

选项B.

<script src="./assets/js/main.js" type="module"></script>
<script src="https://maps.googleapis.com/maps/api/js?key=API_KEY&callback=initMap"></script>
Run Code Online (Sandbox Code Playgroud)

哪里initMapmain.js和看起来是这样的:

function initMap() {

  class Alpha extends google.maps.MVCObject {}
  class Bravo extends google.maps.MVCObject {}
  class Charlie extends google.maps.MVCObject {}
  // More classes.
  class Zulu extends google.maps.MVCObject {}

  // Rest of code.

}
Run Code Online (Sandbox Code Playgroud)

选项C.

其他一些方法.

javascript google-maps google-maps-api-3

8
推荐指数
1
解决办法
1130
查看次数

"async defer"在一起使用时会做什么?

我遇到了以下代码:

<script src="foo.js" async defer>
Run Code Online (Sandbox Code Playgroud)

我明白<script async...>将下载脚本,然后解析它暂停HTML解析.我也明白<script defer...>在解析所有HTML之后会下载脚本并进行解析.

<script async defer...>什么(例如异步和延迟一起使用)?

javascript

7
推荐指数
1
解决办法
1890
查看次数

HTML5脚本标记确实推迟等待任何以前的异步脚本

HTML5脚本标记加载指令似乎很酷/sf/answers/1684926141/

是否可以异步加载一堆脚本,但有一个脚本等待执行基于异步完成.

<script src="//some.cdn/jquery.js" async></script>
<script src="//some.cdn/underscore.js" async></script>
<script src="/my-app-which-uses-_-and-jquery.js" defer></script>
Run Code Online (Sandbox Code Playgroud)

我的应用程序脚本是否可以保证在我的库之后执行,还是只能按顺序执行其他延迟脚本?

javascript html5

6
推荐指数
1
解决办法
879
查看次数

添加脚本标签并按顺序加载脚本

我有以下功能可以加载给定脚本:

function addScriptTag(url){
  var script = document.createElement('script');
  script.src = url;
  document.getElementsByTagName('head')[0].appendChild(script);
}
Run Code Online (Sandbox Code Playgroud)

我使用了该函数来加载彼此相关的库,它们lib2依赖于lib1lib1依赖于jquery

function loadThemAll(){
  addScriptTag('http://path/to/jquery.js');
  addScriptTag('http://path/to/lib1.js');
  addScriptTag('http://path/to/lib2.js');
}
Run Code Online (Sandbox Code Playgroud)

问题在于,即使lib1按此顺序,当需要jQuery时,也找不到它。同样适用于lib2该用途lib1

如何使script标签创建并按顺序加载脚本?换一种说法 :

添加脚本标签jQuery并加载它。

jQuery被加载,添加脚本标记lib1并加载它。

lib1被加载,添加脚本标记lib2并加载它。

javascript

6
推荐指数
1
解决办法
53
查看次数

What's the difference between $(document).ready() and just omit it?

In most tutorials, there are two ways mentioned about how to execute a jquery script:

  • with window.onload hook.
  • with a $(document).ready(function(){...}) event (and could be abbreviated to $(function(){...}))

And I found that it even works when I omit all them, just place the code in a <script></script> occlusion could achieve the same purpose. Just like this:

<html>
<script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
<body>
    <button id="btn" name="test" value="clickme">clickme</button>
</body>
<script>

//$(document).ready( function(){
//    $('#btn').on("click", function(e){
//        alert("hi")
//     }
//)})

$('#btn').on('click', function(e){
    alert('hi') …
Run Code Online (Sandbox Code Playgroud)

jquery

5
推荐指数
1
解决办法
2617
查看次数