大家下午好,我有一个独特的情况,我试图以特定顺序加载 javascript。浏览器似乎一次通过多个文件从服务器请求 javascript。我的问题是,我需要加载一个,它设置一个 cookie,然后我需要第二个。这是为了检查并查看是否启用了第 3 方 cookie。并且根据它们是否存在,它将隐藏或显示 DOM 元素,特别是隐藏 iFrame 并显示一个窗口,说明他们需要启用第 3 方 cookie,或者有一个他们可以点击的链接。
我有一个 .net MVC 应用程序,它有一个 Controller 和 2 个操作。操作 1 称为 setcookie,除了设置 cookie 外什么都不返回。
第二个操作称为 ValidateCookie,它会检查 cookie 是否已发送,并返回一个返回 true 或 false 的简单 Javascript 函数。但问题是,有时浏览器会在 setcookie 之前调用 ValidateCookie。我已经使用 fiddler 验证了这一点。但并非总是如此,通常它会以正确的顺序被调用。也许十分之一是倒退的。
我试过将 SetCookie 放在头部并在主体末尾进行验证。在正文顶部设置,在最后验证,都在最后,使用链接标签调用setcookie,使用img标签,使用CSS @import。设置延迟=无。我似乎无法让它以正确的顺序加载 javascript。因为它的顺序不正确,所以 cookie 结果函数很可能会返回 false,即使它们确实启用了它们。
我发现了一些让第一个 javascript 调用一个方法将第二个脚本标记动态添加到 html 的解决方案。一切都很好,除了我需要在一切继续之前加载这 2 个 javascript。并在所有其他脚本完成后加载动态添加的脚本标签。
也许这也是不可能的,因为现在一切都是关于同时加载多个文件。
最佳答案
当请求第二个脚本时,您可以将第一个脚本中的 cookie 发送到服务器的唯一方法是在第一个脚本设置 cookie 后手动加载第二个脚本。你不能依赖 <script>
标记为您执行此操作,因为允许浏览器预取脚本,即使它们将在 <script>
中执行。标记顺序。
所以,事件的顺序是这样的:
- 第一个脚本加载并执行。
- Cookie 已设置。
- 第二个脚本被动态添加到文档中。
您还必须确保第二个脚本未被缓存,可能是通过在 URL 末尾附加一个唯一参数(通常是日期时间戳)。
您还需要确保页面、脚本和 cookie 都在公共(public)域中,并且对 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>
关于javascript - 以特定顺序加载(请求)javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15212579/