背景
我正在为我使用的 CMS 开发响应式图像插件,并且我选择使用立即 set-cookie 方法来告诉服务器用户屏幕的尺寸。
对于那些不熟悉这一点的人,这意味着您在文档顶部的 javascript 中设置了一个 cookie,因此当浏览器继续解析文档的其余部分时,它会发送您的 cookie 以及它发送的任何图像请求。
这适用于大多数浏览器,除了 IE9。对此流行的解释似乎是 IE9 在完成文档解析之前实际上并没有设置 cookie,这似乎是非常奇怪的行为。我已经完成了自己的测试,得出的结论是 cookie 不仅仅是一些特殊的例外,它实际上是 IE9 处理 javascript 的方式 - IE9 似乎在完成对文档的解析之前不会执行任何 javascript。
不幸的是,它在执行内联 JS 之前发送了所有对外部资源的请求。
问题
有没有办法强制 IE9(和其他表现出这种行为的浏览器)在文档仍在被解析时执行 javascript?
编辑
所以我开始取得进展,这可能与 IE9 javascript 引擎有关 - 它进行后台编译。我想它会等到它得到所有的 javascript 后再编译它。我想知道是否有一个鲜为人知的 IE 脚本标签属性可以切换特定块的行为。要去打猎,有什么发现我会告诉大家的。
编辑 2
似乎我对 IE9 使用 javascript 的方式的假设并不完全正确。这是科学界将其描述为“甚至没有错”的不幸情况之一!因此,我提出的问题不再有用,因为它依赖于一些错误的假设。但是,我将在下面发布我用于测试的修改后的代码:
测试.php
<?php
file_put_contents("log.txt", "\r\n\r\nTestResStart\r\n", FILE_APPEND);
?>
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<img src="image.php?q=1" />
<script type="text/javascript">
document.write('<img src="image.php?q=4-js" />');
alert("HALT!");
document.write('<img src="image.php?q=5-js" />');
</script>
<img src="image.php?q=2" />
<img src="image.php?q=3" />
</body>
</html>
图像.php
<?php
session_start();
file_put_contents("log.txt", "image".$_GET['q']."\r\n", FILE_APPEND);
$rImg = ImageCreate(300,50);
$cor = imagecolorallocate($rImg, 225, 225, 225);
$cor = imagecolorallocate($rImg, 0, 0, 0);
imagestring($rImg,2,0,0,$_GET['q'],$cor);
header('Content-type: image/jpeg');
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
imagejpeg($rImg,NULL,100);
运行 test.php 将通过 html 和 document.write 加载图像。image.php 将按照收到的顺序记录这些请求。您会注意到,即使显示警报,请求也会继续通过 - 因此警报不会停止执行(尽管大多数其他浏览器表现出类似的行为)。回到广场 1!