javascript<;脚本>;标记-src下载前的代码执行

javascript<;脚本>;标记-src下载前的代码执行,javascript,html,Javascript,Html,在这个片段中 <script src="takes very long to download" type="text/javascript"> alert('hi'); </script> 警报(“hi”); 让我们假设脚本需要很长时间才能下载。是否有可能在脚本下载完成之前触发警报“hi”?如果是,哪些浏览器可以这样做? 请注意,我特意在同一个标记中放置了“alert('hi')” 谢谢警报('hi')永远不会触发,因为脚本标记支持内联代码或外部文件代码 请阅

在这个片段中

<script src="takes very long to download" type="text/javascript">
  alert('hi');
</script>

警报(“hi”);
让我们假设脚本需要很长时间才能下载。是否有可能在脚本下载完成之前触发警报“hi”?如果是,哪些浏览器可以这样做? 请注意,我特意在同一个标记中放置了“alert('hi')”

谢谢

警报('hi')
永远不会触发,因为
脚本
标记支持内联代码或外部文件代码

请阅读位于

脚本可以在脚本元素的内容中定义,也可以在外部文件中定义。如果未设置src属性,则用户代理必须将元素的内容解释为脚本如果src具有URI值,则用户代理必须忽略元素的内容,并通过URI检索脚本


否。
src
属性的存在将导致忽略元素的子节点

如果您有两个脚本元素,那么第二个脚本将始终执行第二个脚本,因为脚本元素被阻塞


只有当您有两个脚本元素且第一个脚本元素有两个脚本元素时,才能在第一个脚本元素之前执行第二个脚本元素。

如果您有以下代码,并且在下载所有脚本之前不希望触发警报(“hi”),则可以等待document ready事件。您可以使用jQuery或vanilla JavaScript来实现这一点

<script src="takes very long to download" type="text/javascript"></script>
<script type="text/javascript">
   alert('hi');
</script>

这是因为您无法导入这样的脚本,并在同一脚本元素中运行javascript。。。因为外部脚本将覆盖您编写的javascript。。。。把它们放在不同的标签里。。。另外,为了更快的js导入,制作一个模拟js src

为什么不能使用另一个脚本标记呢?复制可能的重复,这与使用任何东西无关。我没有陷入困境——我只是想弄清楚在这种情况下会发生什么——在所有浏览器中,我如何确保仅在下载了src javascript时调用函数。我这样做的方式是在脚本的“onload”上动态调用calbank函数。var head=document.getElementsByTagName('head')[0];var script=document.createElement('script');script.src=url;script.onload=回调;但我想知道这是否也可以通过其他方式实现根据这个答案的第二段。那么在这种情况下,只有在下载了foo之后才会调用foo()?不管花的时间是否太长?我认为浏览器开始下载源代码并继续(而不是等待下载完成)?正如我所说的,脚本元素被阻塞了。除非您明确地说它可以异步加载,否则浏览器不会运行超出它的任何内容。它可能是document.write(例如)。这就是为什么有一个常见的建议是将所有脚本放在
之前。我记不起浏览器名称,但我在其中一个场景中看到了异步加载脚本(导致异常),当时我不得不使用onload回调。但chrome和mozilla不会出现这种情况。谢谢Gaby。好的,如果我移动到它下面另一个脚本标记中的alert('hi'),它是否总是在下载顶部文件后触发?我不这么认为-如果我只想在下载一个文件后执行某些代码(不管需要多长时间)-我目前正在使用“onload”属性(我就是这样做的)var head=document.getElementsByTagName('head')[0];var script=document.createElement('script');script.src=url;script.onload=回调;还有其他方法吗?(不使用jquery)是的,脚本标记是按顺序加载/执行的(除非您使用
defer
属性另外指定)。。。但是为什么您要通过代码而不是使用
script
标记添加脚本呢?因为src的url必须在运行时计算。我不太确定您的语句“脚本是按顺序加载/执行的(除非您使用defer属性另外指定)”。我看到了脚本的并行加载!
$( document ).ready( function () { 
    alert('hi');
});