我已经成功使用此代码很长时间了:
function doXMLReq(url, data) {
var req = false;
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
if (req.overrideMimeType) {
req.overrideMimeType('text/xml');
}
}
req.onreadystatechange = function() { doStuff(req); };
req.open('POST', url, true);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
req.setRequestHeader('Content-length', data.length);
req.setRequestHeader('Connection', 'close');
req.send(data);
}
function doStuff(req) {
if (req.readyState == 4) {
alert(req.status);
if (req.status == 200) {
alert('ok');
}
}
}
该 URL 将帖子提交给返回 XML 的 PHP 脚本。我在这些警报中添加了做简单的测试。显然,警报是主要功能的位置,并且在每个桌面浏览器上,我在提交表单后都会收到“ok”警报。另外,如果发出console.log(xml) 类型语句,我可以看到XML 在桌面浏览器上正确加载,功能正常。
由于某种原因,在移动浏览器(safari、android)上,req.status 警报的值始终为0
,并且不返回 XML 数据。如果我将表单直接发布到 URL(而不是使用这个 JS),浏览器会完美地呈现 XML。
URL 与原始 PHP 文件在同一目录中,在同一域中等。在通过 URL 传递的 PHP 表单上正确设置了标头。
header('Content-type: text/xml');
我在想它可能与https
,因为这是遇到此错误的唯一页面,并且它也是https
该代码所在的一百页中的域中唯一的页面。
我也尝试过使用 jQuery $.ajax
,因为其他线程中的许多其他用户建议使用 jQuery 可以解决跨浏览器的问题。我重写了我的整个 PHP 脚本和我的大部分 javascript 来适应$.ajax
,我必须承认我将代码减少了一个有意义的数量,但是 XML HTTP 请求仍然0
在移动浏览器上返回......这是我使用的代码:
function doForm() {
var form = $('#i_form');
$.ajax({
type: form.attr("method") || 'post',
url: "fooscript.php",
data: form.serialize(),
dataType: 'xml', //Disables xml autoparsing
success: function(xml){
doXMLback(xml);
},
error: function(jqXHR, textStatus, errorThrown) {
alert(jqXHR.status);
alert(jqXHR.statusText);
}
});
return false;
}
function doXMLback(xml) {
var errors = $(xml).find("errors").text();
var success = $(xml).find("uri").text();
if (errors) {
errmsg = errors.split("|");
errmsg = errmsg[1];
$('#er').text(errmsg);
return false;
}
if (success) {
window.location = success;
}
}
(显然,上面没有提交表单,而是有一个 div,它有一个简单的 onclick 函数,它调用该doForm()
函数)......
如何让在 3G/4G 上运行的移动浏览器提交到表单并使用 ajax 接收回 XML 数据?