我有一个非常简单的功能,旨在获取表单数据并通过CORS请求发送它。基本上它看起来像这样......
window.onbeforeunload = function() {
formData = getFormData();
logAbandonment(formData);
// return formData;
// alert(formData);
}
function logAbandonment(formData)
{
if(!cors_request) {
cors_request = true;
} else {
return;
}
var url = 'http://mydomain.lan/sub/index.php';
var xhr = createCORSRequest('POST', url);
if (!xhr) {
console.log('Error: CORS not supported.');
}
xhr.send(formData);
}
function createCORSRequest(method, url)
{
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr) {
// Check if the XMLHttpRequest object has a "withCredentials" property.
// "withCredentials" only exists on XMLHTTPRequest2 objects.
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined") {
// Otherwise, check if XDomainRequest.
// XDomainRequest only exists in IE, and is IE's way of making CORS requests.
xhr = new XDomainRequest();
xhr.open(method, url);
xhr.onprogress = function () { };
xhr.ontimeout = function () { };
xhr.onerror = function () { };
xhr.onload = function() { };
} else {
// Otherwise, CORS is not supported by the browser.
xhr = null;
}
return xhr;
}
function getFormData()
{
if(typeof FormData == 'undefined') {
return serialize(document.getElementById('AppForm'));
} else {
return new FormData(document.getElementById('AppForm'));
}
}
因为这是我正在使用的IE9,我正在使用XDomainRequest javascript对象。
它成功触发了ajax请求,但这里是我遇到问题的地方。它会在不发送formData的情况下触发它,除非我取消注释返回或警报行,在这种情况下它完美地工作。当我这样做时,我可以在警报中看到它应该说的正确数据。
我注意到的另一件事是,只有当我关闭浏览器或关闭标签时才会发生这种情况。如果我刷新页面,它的工作方式就像我想要的那样。
我想也许IE9在请求完成之前有一些奇怪的方法来破坏dom,但不幸的是,我无法想办法在XDomainRequest上将其设置为async false。
我也试过设置超时,但这似乎完全打破了它。
答案 0 :(得分:0)
这不是一个解决方法,但我发现在调用xdr的open方法时将查询字符串附加到url的末尾时,这非常有效。