2014-02-26 71 views
1

在我们的Web应用程序中,当用户退出/关闭窗口时,必须使用连接了'kill'操作的ajax调用服务器。然而,无论是卸载/ pagehide事件不会被解雇,或者没有被执行Ajax调用和我一直不能确定,为什么...Javascript - 在卸载/页面隐藏事件中调用AJAX

语境:

  • 不幸的是,我们必须使用香草js;没有jQuery。
  • 我很清楚onbeforeunload,但对于各种情况下,ajax调用不能在该事件发生(除非有一些神奇的 黑客,我不知道这抑制了默认弹出框 和/或提供了一种方法看到用户的回应)。
  • 我们必须兼容IE7 +,FF14 +。无需支持Chrome,Safari,Opera。
  • 我知道ajax功能的作品 - 它被称为无数次,而浏览器是积极的,并已经过全面测试。

相关代码...从.JSP

代码:从utils的文件

if (window.onpagehide || window.onpagehide === null) { 
    addEvent(window, 'pagehide', kill); 
} else { 
    addEvent(window, 'unload', kill); 
} 

代码:

function addEvent(obj, evt, fnc) { 

    if (obj.addEventListener) { //W3C 
     obj.addEventListener(evt, fnc, false); 
     return true; 
    } else if (obj.attachEvent) { // MSFT 
     return obj.attachEvent('on' + evt, fnc); 
    } else { // Legacy 

     evt = 'on'+evt; 

     if(typeof obj[evt] === 'function') { 

      // Object already has a function on traditional 
      // Let's wrap it with our own function inside another function 
      fnc = (function(f1, f2) { 
       return function() { 
        f1.apply(this, arguments); 
        f2.apply(this, arguments); 
       } 
      })(obj[evt], fnc); 
     } 

     obj[evt] = fnc; 
     return true; 
    } 

    return false; 
}; 

    function kill() { 

     ajax.post({ 
      "refCallback": null, 
      "sURL": "--deleted--", 
      "async": false, 
      "timeout": 10000, 
      "params": {"op": "kill", 
         "guid": guid}}); 

    }; 

任何见解或指针将是非常有帮助的..

回答

0

这已经有一段时间了,因为我已经搞砸了onunload d onbeforeunload,但这是我记得的。尝试使用onunload时,由于卸载页面的请求已在进行中,因此您有很短的时间来执行任何操作。通常,您需要在onbeforeunload方法内执行代码。至于你的问题“除非有一些神奇的黑客,我不知道这会抑制默认弹出框和/或提供一种方式来查看用户响应”,有一种方法可以禁止默认的弹出框,但如果你的意图是用一个自定义的替换它,你运气不好。要使弹出框不出现,只需在onbeforeonload调用中不返回任何内容。

我记得我需要做的事情非常类似于你问的东西。我也无法使用JQuery,但是我使用了对jsp的调用来放弃凭据,而不是使用AJAX。我实际上问了Stack Overflow的问题,并自己回答了这个问题:How to logout during onbeforeunload/onunload using Javascript。尝试用您的AJAX呼叫替换我的jsp调用?

下面是unbeforeunload的一个很好的例子骨架相比onunload的:

​​

上面的代码是一个答案我有,给我的感觉的结果,是在Show popup window when the browser closeOnUnload Alert Error "NS_ERROR_NOT_AVAILABLE"类似的问题。

即使你使用的是onbeforeunload而不是onunload,如果我没有记错的话,如果你不显示弹出窗口,它将不会执行冗长的代码。我知道这个答案并不是你正在寻找的东西,但希望它可以引导你走向正确的道路。

+0

我怀疑资源被卸载,但我希望在这些资源被卸载之前快速进行ansyc ajax调用。我最终实施了一项围绕这项工作的工作(稍微不太优雅)。感谢您的确认/回答! – bcwebb88

0

实际上,可以在页面隐藏或卸载(不推荐使用但仍在工作)的事件处理程序中执行AJAX请求,但您需要使此请求同步,否则请求只会被Safari抛弃。

window.addEventListener("pagehide", function(evt){ 
    var request = new XMLHttpRequest(); 
    request.open('GET', '/bar/foo.txt', false); // `false` makes the request synchronous 
    request.send(null); 

    if (request.status === 200) { 
    // your request has been sent 
    } 
}, false);