强制Internet Explorer 9在解析页面时执行JavaScript?

背景

我正在为我使用的CMS创建一个响应式图像插件,并且我选择使用立即的set-cookie方法来告诉服务器用户屏幕的尺寸。

对于那些不熟悉这一点的人来说,这意味着你在文档顶部的JavaScript中设置了一个cookie,所以当浏览器继续解析文档的其余部分时,它会发送你的cookie以及它发送给图像的任何请求。

这适用于大多数浏览器,IE9除外。 这个流行的解释似乎是,IE9在解析完文档之前并没有真正设置cookie,这看起来很奇怪。 我做了我自己的测试并得出结论,即cookies不仅仅是一些特殊的异常,它实际上是IE9对待javascript的方式 - IE9似乎在完成文档解析之前不会执行任何JavaScript。

不幸的是,在它开始执行内联JS之前,它会发送所有对外部资源的请求。

有没有办法强制IE9(和其他浏览器展示这种行为)在文档仍然被解析时执行JavaScript?

编辑

所以我开始取得进展,这可能是与IE9的JavaScript引擎 - 做后台编译。 我想它会在编译之前等到它获得了所有的javascript。 我想知道是否有一个鲜为人知的用于IE的脚本标记属性,可以切换特定块的行为。 打算去打猎,如果我找到任何东西,我会让你知道。

编辑2

似乎我并不完全正确的关于IE9与JavaScript工作方式的假设。 这是科学界将其描述为“甚至没有错”的不幸情况之一! 因此,我提问的方式不再有用,因为它依赖于一些错误的假设。 不过,我会在下面发布我用于测试的修改代码:

test.php的

<?php
file_put_contents("log.txt", "rnrnTestResStartrn", 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>

image.php

<?php
session_start();
file_put_contents("log.txt", "image".$_GET['q']."rn", 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!


使用document.write()将脚本标记写入document.write()可能会解决您的问题。

这看起来很奇怪,但我注意到这样做会导致DOM在每个脚本之后实际呈现到屏幕上(否则,如果在加载过程中尝试对进度条进行动画处理时非常烦人)

如果他们有同样的原因,它可能会解决您的cookies问题。


您可以延迟DOM的构建。 去'模板方式':

1)将html代码放入<script type="text/template" id="someID"></script> 。 这将导致浏览器有一个非JavaScript类型的脚本节点。 这会导致浏览器忽略其内容,但您可以通过获取脚本节点的innerHTML来访问它。

2)当页面已经堆积并且厨师被设置后,您可以附加一个document.ready事件hanlder来执行DOM的实际构造。 在这一点上,解析和初始渲染将完成,所以我希望IE现在已经设置了cookie。 如果没有,触发在setTimout(fn,1)中构建DOM;

3)做一些事情:

var content = document.getElementById('someID');
var container = document.getElementById('containerID'); // This could be an empty DIV right next to the <script> tag. 
container.innerHTML = content.innerHTML;

因此,回答这个问题已经成为问题。

你如何获得IE9来纪念你设置它们时设置的cookies?

答案是特征检测。 我们可以检测(使用旧式元标记)浏览器是否支持即时cookie设置,如果不支持,我们会尽快重新加载页面(在我们浪费太多时间之前)。

代码

<script type="text/javascript">
    var c ='resolution='+Math.max(screen.width,screen.height)+("devicePixelRatio" in window ? ","+devicePixelRatio : ",1");
    var cSet = new RegExp(c);

    //If cookies are enabled and our cookie isn't set
    if(navigator.cookieEnabled && !cSet.test(document.cookie))
    {
        //Set the cookie via a meta tag
        document.write('<me'+'ta http-equiv="Set-Cookie" content="'+c+'; path=/" />');

        //If it hasn't been parsed yet
        if(!cSet.test(document.cookie))
        {
            //Reload the page
            document.location.reload();
        }
    }
</script>

在我的博客上这是一个更完整,更流畅的解决方案:

http://iain-fraser.com/2012/11/cookie-based-responsive-images-that-work-in-ie9/

我将在周末之后更新这篇文章 - 我只是在新鲜的时候把它全部放下。 当然,如果我进一步发展,我会相应地更新。

链接地址: http://www.djcxy.com/p/43673.html

上一篇: Force Internet Explorer 9 to execute javascript while parsing page?

下一篇: Why is IE9 taking so long to execute some JQuery?