JSONP + onbeforeunload + кнопка возврата + проблемы - PullRequest
1 голос
/ 19 ноября 2009

Я пытаюсь сделать JSONP-запрос к серверу по событию beforeunload. Все это прекрасно работает, пока я не начну играть с кнопкой возврата. Если я ухожу со страницы и нажимаю «назад» в следующий раз, когда вызывается событие beforeunload, создается впечатление, что он выполняет запрос JSONP, но сервер его никогда не получает.

Примечание (1): это было проверено на IE и FF (проблема появляется на обоих).

Примечание (2): Я также тестировал с использованием метода jQuery.getJSON, и у него возникла та же проблема, поэтому я предполагаю, что функция makeJSONPCall верна. (Я могу ошибаться)

Есть идеи у кого-нибудь?

Некоторый код для контекста:

JSONP CALL:

makeJSONPCall('http://serverurl.mvc/method?args=' + data, 'callbackfunction');      

function makeJSONPCall(url, callbackname)
{                
  if (url.indexOf("?") > -1) url += "&jsonp=" 
  else url += "?jsonp=" 
  url += callbackname + "&";
  url += new Date().getTime();
  var script = document.createElement("script");            
  script.setAttribute("id", "JSONP");
  script.setAttribute("src",url);
  script.setAttribute("type","text/javascript");                
  if (document.head) document.head.appendChild(script);
  else document.body.appendChild(script);    
}

Спасибо

Ответы [ 2 ]

0 голосов
/ 02 апреля 2012

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

То, что я смог выяснить, это:

  • Обработчик onbeforeunload блокирует браузер от уничтожения текущей страницы
  • если вы ничего не возвращаете, всплывающее окно не появляется.

Таким образом, ваш код будет работать до тех пор, пока работает обработчик событий.

псевдокод:

window.onbeforeunload = function() {
  startAsynchronousSending();
  //do lots of slow and synchronous stuff to delay destroying the window//
  //return statement deliberately missing
}

На данный момент это уже работает для меня, но часть задержки - это просто интенсивная загрузка ЦП. Это имеет значение (есть достаточно времени для отправки запроса), но я ищу лучшую задержку.

Смотри также: http://forums.thedailywtf.com/forums/t/24374.aspx

Буду признателен за комментарии с идеями о том, что включить в цикл. Я принимаю во внимание некоторые варианты:

  • тратить процессор на математику на большие числа
  • доступ к локальному хранилищу (синхронный вызов, операция ввода-вывода)
  • доступ к DOM
  • синхронный вызов ajax (но я не хочу включать код для ajax в скрипт, который его не использует)

Есть идеи?

0 голосов
/ 19 ноября 2009

Это событие довольно странное. В конечном итоге вы можете решить не использовать его. Прежде всего, убедитесь, что вы делаете синхронный пост. Затем вам, вероятно, нужно будет предоставить пользовательский интерфейс, чтобы браузер не менял местоположение слишком быстро. Однажды я использовал что-то похожее на приведенное ниже, и это сработало, но в итоге я поступил иначе.

    window.onbeforeunload = function() {
               // stuff do do before the window is unloaded here.
               if(IsDirty()) {
            //i only want to call ajax if I need to.
                setTimeout(function(){
                    DoAjaxSaveSynchronously (); // this was important
                    ClearDirty();
                        }, 500);
//this return value causes the browser to pop a modal window.
                return "You have unsaved work. Please stay on this page to save your work.";
               }
            }
...