如果在单个HTML文档中多次使用具有相同“src”属性的<script>标记会发生什么?</script>

时间:2009-10-07 19:37:22

标签: javascript html asp.net-mvc

虽然我几乎可以肯定这个问题的答案将是浏览器特定的,但是当使用多个&lt; script&gt; 标签并具有相同的src属性时,是否有任何浏览器定义行为?< / p>

例如......

<script src="../js/foo.js"></script>
...

<!-- what happens here? -->
<script src="../js/foo.js"></script>

我首先提出这个问题的原因是,在我的特定情况下,我在使用JQuery的ASP.NET MVC应用程序中使用部分视图。 JQuery JS文件都通过脚本标记包含在主模板文件中。我更喜欢将脚本标记添加到部分视图文件中,以便在主模板的上下文之外使用它们时,它们将自动包含所有必需的JS文件,而不依赖于另一个视图或模板来包含它们。但是,我当然不希望导致JS文件多次转移到客户端,或任何其他可能对用户体验产生负面影响的副作用。

我现在的想法是,大多数(如果不是全部)主要浏览器(FF,Safari,IE,Opera)将在第一次使用时缓存JS文件,然后在后续脚本标签上浏览器将使用缓存的副本(如果可用)以及它是否已过期。但是,缓存行为通常可以通过浏览器配置进行更改,因此依赖任何类型的缓存行为似乎都不太“安全”。

我是否必须接受这样的事实,即我的部分视图将依赖于其他模板或视图,包括相应的JS文件?

4 个答案:

答案 0 :(得分:11)

即使它们被缓存,您也可能遇到问题,因为相同的代码将被执行两次。至少,这将导致浏览器花费超过必要的时间。它可能会导致错误,因为大多数JavaScript代码都没有写入执行两次。例如,它可能会将相同的事件处理程序连接两次。

答案 1 :(得分:1)

不要直接在部分中输出脚本标记。创建一种机制来注册脚本文件以供以后包含。该机制只能负责包含一次文件。

答案 2 :(得分:0)

FF 3.5x,Chrome 4x只包含一次。

:) IE 8有两个副本(在Developer Tools&gt; Scripts选项卡中查看有两个jquery-1.3.2.min.js条目)

答案 3 :(得分:0)

当下载JavaScript时,JavaScript会被提供给解释器。在命名空间冲突的情况下,只有给定范围的变量名才能继续执行。通常,这最后一个过程可以防止因更早地将函数提供到解释器中而产生问题。问题是函数定义了变量范围,这些变量可能是引入其他命名空间变量范围的其他函数。这是一个问题,因为如果函数共享相同的名称值并包含不同的变量定义,则可能存在泄漏,即使在覆盖该函数之后,函数提供到解释器的变量仍然存活,这可能会导致预期的命名空间冲突。

如果两次包含完全相同的文件,则应该没有问题。当包含相同文件的不同版本或包含具有相同功能名称的不同文件时,会发生此问题。两次包含相同的文件可能意味着多次传输,这是浪费带宽。