以特定顺序加载(请求)javascript

时间:2013-03-04 22:42:42

标签: javascript

大家下午好,我有一个独特的情况,我试图按特定顺序加载javascript。似乎浏览器一次通过多个文件从服务器请求javascript。我的问题是,我需要一个加载,设置一个cookie,然后我需要第二个。这是为了检查并查看是否启用了第三方cookie。根据它们是否存在,它将隐藏或显示DOM元素,特别是隐藏iFrame并显示一个窗口,说明他们需要启用第三方cookie,或者有一个他们可以点击的链接。

我有一个.net MVC应用程序,它有一个控制器和2个动作。动作1被称为setcookie,只返回设置cookie。

第二个操作称为ValidateCookie,它检查cookie是否已发送并返回一个返回true或false的简单Javascript函数。但问题是,有时浏览器会在setcookie之前调用ValidateCookie。我用fiddler证实了这一点。但它并不总是,通常是以正确的顺序调用。也许十分之一是倒退。

我已经尝试将SetCookie置于头部并在身体末端进行验证。设置在正文的顶部,最后使用链接标记调用setcookie,使用img标记,使用CSS @import进行验证。设置defer = none。我似乎无法以正确的顺序加载javascripts。因为它的顺序不正确,所以cookie结果函数很可能会返回false,即使它们确实启用了它们。

我找到了一些解决方案,第一个javascript调用一个方法,动态地将第二个脚本标记添加到html。一切都很好,除了我需要在一切继续之前加载这2个javascripts。在完成所有其他脚本后,动态添加脚本标记。

也许它只是不可能,因为一切都是关于现在同时加载多个文件。

1 个答案:

答案 0 :(得分:2)

当第二个脚本被请求时,您可以从第一个脚本发送到服务器的唯一方法是在第一个脚本设置完cookie后手动加载第二个脚本。您不能依赖<script>标记为您执行此操作,因为允许浏览器预取脚本,即使它们将以<script>标记顺序执行。

所以,事件的顺序是:

  1. 加载并执行第一个脚本。
  2. Cookie已设置。
  3. 第二个脚本动态添加到文档中。
  4. 您还必须确保第二个脚本没有被缓存,可能是通过在URL的末尾附加一个唯一的参数(通常是日期时间戳)。

    您还需要确保页面以及脚本和cookie都在共同域中,并在cookie上进行适当设置,以便他们都可以访问cookie。

    这是一个例子(firstscript.js设置cookie,当请求secondscript.js时将其发送到服务器):

    <script src="firstscript.js"></script>
    <script>
    (function() {
        var dynScript = document.createElement("script");
        var now = new Date().getTime();
        dynScript.src = "secondscript.js?ts=" + now; 
        document.getElementsByTagName("head")[0].appendChild(dynScript);
    })();
    </script>