2013-08-17 2 views
0

Вот минимальный пример -onbeforeunload, кажется, не всегда trigerred

index.php

<?php 
$count = file_get_contents("count.txt") + 0; 
file_put_contents("$count.txt [loaded]", ''); 
file_put_contents("count.txt", $count + 1); 
?> 

<!doctype html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <script src="jquery-1.10.2.min.js"></script> 
</head> 
<body> 
<main> 
    <p> hi there </p> 
</main> 

<script type="text/javascript"> 
var id = "<?php echo $count; ?>"; 
</script> 

<script src="script.js"></script> 
</body> 
</html> 

script.js

$(document).ready(function() 
{ 
$(window).bind('beforeunload', function() { 
    $.post("unloader.php", { id : id }); 
}); 

}); 

unloader.php

<?php 
file_put_contents("$_POST[id] [unloaded]", ''); 

Когда я открыть веб-страницу, файл создается с номером счета в качестве его имени. Когда я закрываю запросы jquery вкладки unloader.php, который является просто автономным скриптом, который создает файл с номером счета как его имя.

Иногда это работает, иногда это не так. Я имею в виду, что начальный файл всегда создается. Но иногда файл, который должен быть создан при закрытии, не создается. Любая идея, где возникла проблема?

+0

Возможно, это связано с тем, что вы связываете событие onbeforeunload внутри функции DOMReady. Если процесс размещения содержимого занимает некоторое время, DOM может не быть готов, когда пользователь выгружает страницу. – BenM

+0

@BenM К сожалению нет, я пробовал с пустой страницей и ожидал некоторое время перед закрытием. И файл по-прежнему иногда не создается на сервере. – user544262772

+1

Можете ли вы объяснить суть этого? Вы просто создаете пустой файл на сервере с именем '$ _POST [id] [unloaded]'? Почему бы просто не использовать cookie или сеанс? – BenM

ответ

2

Вы не можете (надежно) совершать звонки AJAX при разгрузке страницы. Поскольку он выгружается, все, что происходит, будет удалено.

Если браузер достаточно быстро выполнил вызов AJAX (или сервер достаточно медленно реагировал на загрузку новой страницы), то вы должны увидеть результат, но он совсем не надежен.

+0

Спасибо за этот ответ, я думаю, что я поеду с основным контуром, который каждую секунду отправляет запрос, обновляя удаленный файл, поэтому я едва могу знать, сколько времени осталось на странице. Звучит довольно грязно, но это будет сделано. – user544262772

+0

Каждые * секунды * ??? Удачи ... Лично я просто держу поле в базе данных, которое я обновляю, когда пользователь загрузил последнюю страницу, и предположите, что они будут в сети в течение следующих 15 минут. Если вам нужен постоянный пинг, 30 секунд до минуты - хорошая отправная точка. –