PDA

Просмотр полной версии : URLLoader некорректно работает на IE


MaxCmd
10.07.2007, 19:34
Здраствуйте!

После некоторых трудностей, сделал слайдшоу рисунки, который загружает картинки из сервера.

При воспроизведения слайдшоу флеш файл можут загрузить/отправить данные. Получить параметры картинки, отправить запрос про клика, и тд.
Все прекрасно работает на Firefox, Opera. Но на IE появляется проблемы, после первых-третых загрузок флеш вообще не загружает данные. Отправлять может.

На каждом секунду 2 раза загружаю данные через класс URLLoader(вырезка из кода):

var msgLoader:URLLoader;
var timer:Timer;

function setTimer() {
timer = new Timer(500);
timer.addEventListener("timer", loadMessages);
timer.start();
msgLoader = new URLLoader();
msgLoader.addEventListener(Event.COMPLETE, getMessages);
}

function loadMessages(event:TimerEvent):void {
request = new URLRequest("http://localhost/index.php");
msgLoader.load(request);
}
...

Жду ваших ответов.
Заранее благодарю.

etc
10.07.2007, 22:35
А кто сказал, что за 500 мс данные успеют загрузиться? Там вообще полный хаос начнется…

miramax
11.07.2007, 07:08
Надо таймер запускать в обработчике complete. Что бы только ПОСЛЕ предыдущей загрузки началась следующая.

MaxCmd
11.07.2007, 12:39
__etc, пока на локальном серваке работает.
miramax, спасибо. Попробую.

MaxCmd
11.07.2007, 14:50
Пробовал способ [B]miramax[B].
Но все равно не работает. Потом для теста так сделал.
Написал маленький скрипт, который при каждой обращении добавляет строка параметров к файл. Теперь можно узнать сколько обращения будет к скрипту.
Во флеше:
Потом обработчике COMPLETE(объект msgLoader:URLLoader) добавляю символ на TextField.

На флеше все работает. Он отправляет запрос на сервер и получает ничего. А РНР код только 3 строка добавляет к файлу. Как-то запросы флеш ролика на пути пропадает.

miramax
11.07.2007, 15:45
Может проблема в кэшировании браузера?

MaxCmd
11.07.2007, 16:23
Проблема не в кешировании. Проверил.

MaxCmd
11.07.2007, 19:29
Еще один тест.

Просто создал ролик с таким кодом:
package {

import flash.events.*;
import flash.net.*;
import flash.utils.*;
import flash.display.MovieClip;
import flash.text.*;

public class URLLoaderTest extends MovieClip {

var loader:URLLoader;
var request:URLRequest;
var timer:Timer;
var variables:URLVariables;
var text:TextField;

public function URLLoaderTest() {
text = new TextField();
text.autoSize = TextFieldAutoSize.LEFT;
text.border = true;
addChild(text);

text.appendText("start\n");
variables = new URLVariables();

timer = new Timer(500);
timer.addEventListener("timer", loadSendMsg);

timer.start();

loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, loadComplete);
}

function loadComplete(event:Event):void {
text.appendText("Msg loaded - " + String(loader.data) + "\n");
timer.start();
}

function loadSendMsg(event:TimerEvent):void {
timer.stop();
request = new URLRequest("http://localhost/SP/test/get.php");
loader.load(request);
}

}

}

РНР код(при обрашении просто добавит строка с текстом "getted"):
<?php
$f = fopen("get.txt", "a");
fwrite($f, "getted\n");
fclose($f);
?>

Только первый вызов loader.load(request) обращает на сервер. В файле число строк - 1.

Если запустить этот ролик на Firefox и Opera проблем не будет.
IE шестая. На седмом не пробовал.
Странно.

miramax
11.07.2007, 20:33
Может проблема в кэшировании браузера?

Для избежания кэширования нужно или отправлять POST запросы или каждый раз изменять GET запрос. Функция noCache гарантирует уникальность строки запроса.
function loadSendMsg(event:TimerEvent):void {
timer.stop();
request = new URLRequest("http://localhost/SP/test/get.php?antiCache="+noCache());
loader.load(request);
}

function noCache():String{
var d:Date = new Date();
return d.getHours()+'_'+d.getMinutes()+"_"+d.getSeconds()+"_"+Math.random();
}

MaxCmd
11.07.2007, 20:50
Ура! Заработала!

Спасибо вам [B]miramax[B]! Огромное!!!

Я вообще не думал об этом.

Благодарю вам от узбекских флешеров!

__i
12.07.2007, 12:15
я немного обгрейчу твою функцию - так быстрее и интереснее)

function noCache():String
{
return new Date().getTime().toString();
}

рендом добавлять по вкусу, для посылки данных пойдет, а вот для добавления каких-то id шников в цикле нужно рендом.

miramax
12.07.2007, 12:55
А вдруг он время назад переставит ? :D
Надо быть уверенным на все 100% , ну на 99,999999999999 % =)
Поэтому рандом, как контрольный.

__i
12.07.2007, 13:05
А вдруг он время назад переставит ? :D
Надо быть уверенным на все 100% , ну на 99,999999999999 % =)
Поэтому рандом, как контрольный.

в моем случае все равно не получиться - нужно "угадать" время для миллисекунд!

хотя нет покоя извращенцам :D