Фон
Работя върху плъгин за адаптивни изображения за CMS, който използвам, и избрах да използвам метода за незабавно задаване на бисквитки, за да кажа на сървъра размерите на екрана на потребителя.
За тези, които не са запознати с това, това означава, че задавате бисквитка в javascript точно в горната част на документа, така че когато браузърът продължи да анализира останалата част от документа, той изпраща вашата бисквитка заедно с всички заявки, които изпраща за изображения.
Това работи в повечето браузъри, с изключение на IE9. Популярното обяснение за това изглежда е, че IE9 просто не задава бисквитки, докато не завърши анализирането на документа, което изглежда като наистина странно поведение. Направих собствено тестване и стигнах до заключението, че бисквитките не са просто някакво специално изключение, това всъщност е начинът, по който IE9 третира javascript - IE9 изглежда не изпълнява никакъв javascript, докато не завърши анализирането на документа.
За съжаление, той изпраща всички свои заявки за външни ресурси, преди да стигне до изпълнението на вградения JS.
Въпрос
Има ли начин да принудите IE9 (и други браузъри, показващи това поведение) да изпълняват javascript, докато документът все още се анализира?
РЕДАКТИРАНЕ
Така че започвам да напредвам, може би това е свързано с IE9 javascript двигателя - който прави фонова компилация. Предполагам, че изчаква, докато получи целия javascript, преди да го компилира. Чудя се дали има малко известен атрибут script-tag за IE, който може да превключва поведението за определен блок. Отивам на лов, ще ви уведомя, ако намеря нещо.
РЕДАКТИРАНЕ 2
Изглежда, че не съм напълно прав относно моите предположения относно начина, по който IE9 работи с javascript. Това е едно от онези нещастни обстоятелства, които научната общност би описала като „дори не грешни“! Като такъв, въпросът по начина, по който го зададох, вече не е полезен, защото разчита на някои погрешни предположения. Въпреки това ще публикувам модифицирания код, който използвах за тестване по-долу:
test.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>
image.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!
setcookie()
. Когато HTTP заявката бъде направена, сървърът ще изпрати бисквитката през HTTP заглавката и автоматично ще се зададе във вашия браузър. - person Muthu Kumaran   schedule 16.11.2012IE9 appears not to execute any javascript until it has finished parsing the document.
- Сигурни ли сте, че не сте обвили кода си в обратно извикване на събитие, като DOMContentLoaded или нещо подобно? Вашето твърдение няма смисъл само по себе си. Ако IE не изпълни JS, докато страницата не приключи анализирането, тогава последователниятdocument.write
няма да работи, докато страницата се зарежда, нито щеalert
спре изобразяването на страницата. - person Fabrício Matté   schedule 16.11.2012alert
би спряло изобразяването, а не анализирането, до което време заявката за изображения отдавна е изчезнала. Забележка: Не знам това със сигурност, това е само това, което моето проучване показва. - person Iain Fraser   schedule 16.11.2012