Тема: HTA, JS: Проблема SetTimeout
Проблема точно существует в IE8, на IE 9 не тестировал.
Суть в том нельзя одновременно запустить 10 000 сеттаймаутов или больше, на 9850 ом setTimeout'e генерируется исключение.
Во всех остальных браузерах этого ограничения нет. Только в IE.
Пытался лечить это с помощью заимствований setTimeout у new ActiveXObject("HTMLFile") но ничего не получилось,
вот пример:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">.
<style>
pre{margin:0;border-bottom:1px solid black;padding:0;}
</style>
</HEAD>
<BODY>
<div> A <span id=a>0</span></div>
<button onclick="go('a')">Инкрементить A 10000 раз, а потом декрементить</button>
<SCRIPT LANGUAGE="JavaScript">
function $$(a){return document.getElementById(a)}
function w(t){
var L = document.body;
//alert([t,L.insertAdjacentHTML])
if (L.innerHTML.length>50000)
{
L.innerHTML="";
}
L.insertAdjacentHTML("beforeEnd", "<pre>" + t.replace(/</g,"<") + "\n<\/pre>")
L.scrollTop = L.scrollHeight; //1 << 20;
};
///////////////////////////
$setTimeout.counts=[0];
$setTimeout.okna=[new ActiveXObject("HTMLFile")];
$setTimeout.okna[0].open()
function $setTimeout(callback,delay)
{
var i=$setTimeout.counts.length-1
var c=$setTimeout.counts[i]
if (c>3000)
{
$setTimeout.counts.push(0);
$setTimeout.okna.push(new ActiveXObject("HTMLFile"));
i=$setTimeout.counts.length-1;
$setTimeout.okna[i].open();
w("$setTimeout.counts = " + $setTimeout.counts)
w("$setTimeout.okna = " + $setTimeout.okna)
}
++$setTimeout.counts[i];
var timer = $setTimeout.okna[i].parentWindow.setTimeout(callback,delay)
return {"timer":timer, "okno":i}
}
////////////////////////////
window.onload=function()
{
/*
var p=new ActiveXObject("HTMLFile");
var A="Hello from HTMLfile!"
p.open();
p.parentWindow.setTimeout(function(){alert(A)},2000)
*/
}
////////////////////////////
function foo(obj,bar)
{
obj.innerHTML=parseInt(obj.innerHTML)+1;
var et;
try
{ //$setTimeout
et=setTimeout(function(){
obj.innerHTML=parseInt(obj.innerHTML)-1;
},7000);
}
catch (e)
{
w("et = "+(typeof et))
w("Ошибка "+e.description)
}
}
function go(let)
{
var i=0;
var len=10000;//4925;//9850
for (;i<len ;++i )
{
foo($$(let),i)
}
}
</SCRIPT>
</BODY>
</HTML>Вопрос - как преодолеть это ограничение?
Самое гадкое в этой не доработке МС, что если убрать трай катч то даже не поймешь в чем дело, ИЕ не выдаст ни каких внятных сообщений об ошибке.

