尝试使用javascript在页面退出时发送数据跨域

时间:2016-11-16 01:39:34

标签: javascript xmlhttprequest amazon-sqs onbeforeunload onunload

我有一个不属于我的多个域的脚本,它在页面退出时将数据发送到AWS SQS队列。当我将接收数据的次数与页面上加载脚本的次数进行比较时,我显示57%的时间我没有收到数据。我希望不会收到10到20%的可接受数据。数据正在捕获用户操作,因此我不能在离开页面之前发送任何内容。我想知道我的代码中是否做了明显错误的事情。非常感谢任何帮助。

function addEvent(){
    var myEvent = window.attachEvent || window.addEventListener;
    var chkevent = window.attachEvent ? 'onbeforeunload' : 'beforeunload'; /// make IE7, IE8 compitable
    myEvent(chkevent, function(e) { // For >=IE7, Chrome, Firefox
        if(e || window.event){
            pageUnload();
        }
    });
}
addEvent();

function pageUnload(){
    var host = window.location.host;
    var path = window.location.pathname;
    window.parent.data = '';
    for (var i = 0; i < arrayCount; i++){
        for (var j = 0; j < dataArray[i].length; j++){
            window.parent.data += dataArray[i][j];
        }
    }
    var urlString = 'h='+host+'&p='+path+'&'+window.parent.data;
    var url = 'http://www.AWS_SQS_QUEUE.com?Action=SendMessage&MessageBody='+encodeURIComponent(urlString);
    var method = 'HEAD';//Changed from GET to HEAD to avoid Cross Domain blocking in FF
    if (navigator.sendBeacon) {
        navigator.sendBeacon(url, null);    
    }
    else{
        var xhr = new XMLHttpRequest();
        if("withCredentials" in xhr) {
            xhr.open(method, url, true);
        }
        else if (typeof XDomainRequest != "undefined"){
            xhr = new XDomainRequest();
            xhr.open(method, url);
        }
        else {
            xhr = null;
        }
        if (!xhr){
            return;
        }
        xhr.send();
    }
}

1 个答案:

答案 0 :(得分:0)

尝试将xhr.open()上的第三个参数设置为false。这会导致调用被阻塞,从而阻止页面关闭得太快而无法停止请求。