Всем здравствуйте!
Проблема в том что в IE (8,9 в остальных не проверял), скрипт выполняется следующим образом: сначала происходит первая отправка (send(f=0)) в самом низу скрипта, срабатывает обработчик statechange запрашивает еще раз скрипт и после этого не срабатывает statechange скрипт перестает выполнятся. В других браузерах (chrome, ff3, ff4) все работает как положено. Т.е. отправился запрос пришел ответ сработала функция statechange и все это происходит постоянно....почему в IE не так никак не могу разобраться. Спасибо.
код самого скрипта:
<html>
<head>
<title>Tween tester</title>
<script src="http://openlayers.org/api/OpenLayers.js"></script>
<!--<script type="text/javascript" src = "http://localhost/OpenLayers-2.10/OpenLayers.js"></script>-->
<script type="text/javascript" src="flowplayer/example/flowplayer-3.2.6.min.js"></script>
<script type="text/javascript" src="http://nisoskol.ru/ajax_object.js"></script>
<script src="jquery-1.3.1.min.js"></script>
<script src="jquery.json-1.3.js"></script>
</head>
<body>
<div style="width:100%; height:90%; top: 5%; position:relative" id="map"></div>
<script defer="defer" type="text/javascript">
var feat;
var tr;
var current = {x: 0, y: 0};
var flg = 0;
//var statusElem = document.getElementById('status');
//var statusElem2 = document.getElementById('status2');
//var out_obj;
function send (param)
{
//statusElem.innerHTML = "Запрос данных...";
//alert ("Отправка");
req.open('POST', 'get2.php', true);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
req.send(param);
}
var mercator = new OpenLayers.Projection("EPSG:900913");
var geographic = new OpenLayers.Projection("EPSG:4326");
var options = {
minResolution: "auto",
maxResolution: "auto",
maxExtent: new OpenLayers.Bounds(-20037508.3427892,-20037508.3427892,20037508.3427892,20037508.3427892),
controls: [new OpenLayers.Control.MouseDefaults()]
};
var map = new OpenLayers.Map('map', options);
var mapnik = new OpenLayers.Layer.OSM();
map.addLayer(mapnik);
var lonLat = new OpenLayers.LonLat( 37.89, 51.32 )
.transform(
new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984
map.getProjectionObject() // to Spherical Mercator Projection
);
var zoom=15;
map.setCenter (lonLat, zoom);
//map.zoomToMaxExtent();
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.addControl(new OpenLayers.Control.MousePosition());
map.addControl(new OpenLayers.Control.PanZoomBar());
var req = getXmlHttp();
req.onreadystatechange = function()
{
//alert ("Сработала функция обработчик ответа от сервера");
if (req.readyState == 4)
{
//statusElem.innerHTML = req.responseText;
//alert (req.responseText);
if(req.status == 200)
{
var in_obj = $.evalJSON(req.responseText);
if (in_obj[0].flg == 0)
{
if (in_obj[0].lon[0] == "n") // Если нет координат запросить еще
{
//alert("Нет первой координаты, запрашиваем еще раз");
flg = 1;
send('f=0');
// return;
}
else // Координата пришла, отрисовываем машину, добавляем слой
{
//alert ("Координаты нет, а код продолжает выполнятся")
var lonLat = new OpenLayers.LonLat( in_obj[0].lon[0], in_obj[0].lat[0] )
.transform(
new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984
map.getProjectionObject() // to Spherical Mercator Projection
);
current = {x: lonLat.lon, y: lonLat.lat};
feat = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Point(lonLat.lon, lonLat.lat), {type:15});
var myStyles = new OpenLayers.StyleMap({
"default": new OpenLayers.Style({
pointRadius: "${type}", // sized according to type attribute
graphicZIndex: 1,
label: "31",
fontColor: "#000000",
labelYOffset: 7,
labelXOffset: 13,
fontWeight: 900,
graphic: true,
externalGraphic: "http://nisoskol.ru/mr.png"
})
});
tr = new OpenLayers.Layer.Vector("Маршрутки",
{
styleMap: myStyles,
rendererOptions: {zIndexing: true}
});
tr.addFeatures(feat);
map.addLayer(tr);
var out_obj = new Array;
out_obj[0] = new Object();
out_obj[0]['last_dt'] = in_obj[0].dt[0];
var param = 'par=' + encodeURIComponent($.toJSON(out_obj)) + '&f=1';
//alert ("пришла первая координата, запрашиваем следующие ");
send(param);
}
}
else
{
//statusElem.innerHTML = "flag = 1";
if (in_obj[0].lon[0] == "n") // нет следующих координат
{
//alert ("Идет загрузка координат...");
flg = 1;
var out_obj = new Array;
out_obj[0] = new Object();
out_obj[0]['last_dt'] = in_obj[0].dt[0];
var param = 'par=' + encodeURIComponent($.toJSON(out_obj)) + '&f=1';
//alert("flag = 1, Нет новых координат");
send (param);
//return;
}
else // Есть следующие координаты
{
//statusElem.innerHTML = "i=0";
//alert ("this ON");
var i = 0;
while (in_obj[0].lat[i])
{
i++;
}
}
i--;
//statusElem2.innerHTML = i;
var tween = new OpenLayers.Tween(OpenLayers.Easing.Linear.easeIn);
var lonLat2 = new OpenLayers.LonLat( in_obj[0].lon[i], in_obj[0].lat[i] )
.transform(
new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984
map.getProjectionObject() // to Spherical Mercator Projection
);
//i--;
var to = {x: lonLat2.lon, y: lonLat2.lat};
//var to = {x: lonLat.lon, y: lonLat.lat};
var s = 5000;
if (i > 5)
{
s = 100;
}
else if (i > 2)
{
s = 500;
}
else if (i > 1)
{
s = 1000;
}
else if (i == 0)
{
s = 2000;
}
//var s2 = 2000;
var callbackss =
{
eachStep: function(value)
{
if (i > 5)
{
s = 100;
}
else if (i > 2)
{
s = 500;
}
else if (i > 1)
{
s = 1000;
}
else if (i == 0)
{
s = 2000;
}
if (value.x == to.x && value.y == to.y) // Проверяем доехал до следующей кординаты или нет
{
//alert ("Доехал");
var ll = new OpenLayers.LonLat( in_obj[0].lon[0], in_obj[0].lat[0] )
.transform(
new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984
map.getProjectionObject() // to Spherical Mercator Projection
);
if (to.x != ll.lon) // Если доехал не до последней координаты
{
var ll2 = new OpenLayers.LonLat( in_obj[0].lon[i], in_obj[0].lat[i] )
.transform(
new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984
map.getProjectionObject() // to Spherical Mercator Projection
);
//statusElem.innerHTML = in_obj[0].dt[i];
//statusElem2.innerHTML = i;
i--;
current = {x: value.x, y: value.y};
to = {x: ll2.lon, y: ll2.lat};
tween.stop();
tween.start(current, to, s, {callbacks:callbackss});
}
else // Если доехал до последней точки назначения шлем запрос на новые координаты
{
//alert ("Отправка");
//current = {x: value.x, y: value.y};
tween.stop();
var out_obj = new Array;
out_obj[0] = new Object();
out_obj[0]['last_dt'] = in_obj[0].dt[0];
var param = 'par=' + encodeURIComponent($.toJSON(out_obj)) + '&f=1';
//alert ("Доехал до последней координаты");
send(param);
}
}
tr.features[0].move (new OpenLayers.LonLat (value.x + 0.1, value.y + 0.1));
}
}
tween.start(current, to, s, {callbacks:callbackss});
}
} //if(req.status == 200)
else
{
//alert ("this");
//var t =1;
}
//alert ("this");
} //if (req.readyState == 4)
} //onreadystatechange
//alert ("this");
if (flg == 0)
{
//alert("Запрос данных");
send ('f=0');
}
//alert("the end");
</script>
</body>
</html>
Код библиотеки ajax_object.js
function getXmlHttp(){
var xmlhttp;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}