JSONP + onbeforeunload +后退按钮+问题

时间:2009-11-18 21:39:45

标签: jquery jsonp

我正在尝试在'beforeunload'事件上对服务器进行JSONP调用。这一切都很有效,直到我开始玩后退按钮。如果我离开页面然后在下次调用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 :(得分:0)

那个事件有点古怪。你可能最终决定不使用它。首先,确保您正在制作同步帖子。接下来,您可能需要向用户显示一个UI,以防止浏览器过快地更改位置。我曾经使用过类似下面的东西,但它起作用了,但我最终以不同的方式做事。

    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.";
               }
            }

答案 1 :(得分:0)

我正在研究一个类似的问题 - 我必须发送数据以响应用户离开网站而我的代码作为外部资源存在于某人的页面内。我无法弹出任何内容,我必须拨打电话。我必须使用不能同步的JSONP。

我能弄清楚的是:

  • onbeforeunload处理程序阻止浏览器销毁当前页面
  • 如果您没有返回任何内容,则不会显示弹出窗口。

因此,只要事件处理程序运行,您的代码就会正常工作。

伪代码:

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

目前它已经适用于我,但延迟部分只是一个CPU密集型循环。它确实有所作为(有足够的时间发送请求)但我正在寻找更好的延迟。

另请参阅:http://forums.thedailywtf.com/forums/t/24374.aspx

我很感激有关如何放入循环的想法的评论。我考虑了一些选择:

  • 浪费CPU来大数数学
  • 访问localstorage(同步调用,IO操作)
  • 访问DOM
  • 同步ajax调用(但我不想在不使用它的脚本中包含ajax的代码)

有什么想法吗?