2015-12-11 3 views
1

Я протоколирование, как долго кто-то пребывает в определенной Jsp-страницы, так что я три функции называются в моем теле тега:Когда страница влево/выгружен

<body onunload="pageLeft();" onload="pageEnter(); startInterval();"> 

pageEnter посылает ajax- запрос на сервер, который содержит идентификатор страницы и «1» для ввода страницы.

startInterval начинает интервал и отправляет каждые несколько секунд ajax-запрос на сервер, который содержит «2» для того, чтобы оставаться там.

pageLeft отправить '3' от ajax, так что я знаю, что пользователь покинул страницу.

Наиболее существенными являются «1» и «3», которые используются для группировки всех протокольных данных.

Существует также форма на странице, которая имеет кнопку Submit-:

<form action="/UpdateDB/Customers.jsp" method="POST" name="Custpost"> 

Я был в пределах форм-данные будут переданы Customers.jsp после текущей страницы выгружается и Customers.jsp загруженным. Все мои испытания делают процедуры в Customers.jsp работы не удалось, и теперь я понял, почему:

В базе данных только 1s и 2s, но не 3. Это означает, что текущая страница никогда не выгружается - пока процедура уже началась. ..

Я думал о том, чтобы вручную установить 3-entry в Customer.jsp, но это оставило бы две такие записи в базе данных. Кроме того, если пользователь просто покинет страницу, 3-х записей вообще не останется.

Что я должен делать?

+1

Попробуйте с помощью 'onbeforeunload' метод и дайте мне знать, если он работает. –

+0

К сожалению, никаких изменений вообще нет ... – Qohelet

+0

Ну, как я вижу сейчас, это действительно ухудшилось ... теперь функция pageLeft не вызвана вообще – Qohelet

ответ

0

К сожалению, onbeforeunload не работает должным образом - после замены ничего не было вызвано. onbeforesubmit тоже не выглядел слишком многообещающим (но я не пробовал), но у меня появилась другая идея:

Первый: добавление функции, которая вызывается при отправке в форму, а также переменную, чтобы отличить, имела ли функция были вызваны или нет. Также возможно сохранение идентификатора интервала в переменной intervalid (См: Stop setInterval call in JavaScript):

var nosubmit = true; 

     $(function() { 
      $('#Custpostform').submit(function() { 
       if (nosubmit) { 
        pageLeft(); 
        clearInterval(intervalid); 
        nosubmit = false; 
        return true; // return false to cancel form action 
       } 
      }); 
     }); 

<!-- --> 

<form action="/UpdateDB/Customers.jsp" method="POST" name="Custpost" name="Custpostform"> 

остальное остается в значительной степени то же самое, только onunload теперь немного modiefied:

<body onunload="if (nosubmit) { 
       pageLeft(); 
       nosubmit = false; 
      }" 

Это не совсем решение, которое я ожидал, но оно работает как предполагается

0

Этот способ, казалось бы, был бы лучше. Я могу получить и onbeforeunload, и onunload для работы в Chrome и Firefox (я не тестировал других).

См. the fiddle для интерактивной версии.

HTML:

<body onload="testLoad()" onunload="testUnload()" onbeforeunload="return testBeforeUnload()"> 

</body> 

JS:

function testBeforeUnload() { 
    return "test before unload event"; 
} 
function testUnload() { 
    console.log("test unload event"); 
} 
+0

Хорошо, это похоже на чистое решение, но каково ваше определение «лучше»? – Qohelet

+0

Моя версия выглядит чище, и я думаю, что это лучше. Для этого предназначены эти события. –

Смежные вопросы