1

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

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

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

我尝试将 SetCookie 放在头部并在正文的末尾进行验证。在正文顶部设置,在末尾验证,都在末尾,使用链接标签调用 setcookie,使用 img 标签,使用 CSS @import。设置延迟=无。我似乎无法让它以正确的顺序加载 javascript。因为它的顺序不正确,cookie 结果函数很可能会返回 false,即使它们确实启用了它们。

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

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

4

1 回答 1

2

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

所以,事件的顺序是这样的:

  1. 第一个脚本加载并执行。
  2. Cookie 已设置。
  3. 第二个脚本被动态添加到文档中。

您还必须确保第二个脚本没有被缓存,可能通过在 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>
于 2013-03-04T22:59:05.733 回答