javascript - 为什么 AJAX 调用不仅在 iOS 上有效,在其他任何地方都有效?
问题描述
我正在使用 jQuery 和 PHP 从头开始创建一些 AJAX 星级评级,并意识到它在任何地方都可以正常工作,但在 iOS 上却不行。我检查了一些插件(jRating)并遇到了同样的问题。它将数据发送到服务器(PHP),但在错误:处理程序时返回错误未定义。
我已经尝试了几乎所有其他平台和浏览器(Linux - chrome、FF、Opera;Windows - IE、Edge;Android - Chrome、Opera),一切都按预期工作。iOS上的浏览器都没有工作。值得一提的是,该服务器位于 Amazon Cloudfront 之后。但是我让它传递了来自源服务器的所有标头,我可以在 Chrome 开发人员控制台中看到正确的 Access-Control-Allow-Origin 标头。
我还搜索并尝试了所有关于缓存和相对 URL、JSON 数据类型等的建议,但没有成功。我也尝试过将随机参数添加到 POST URL - 不走运。
有时,假设每三个请求它能够返回正确的数据。
我的 JS 代码:
$('.mystars.ajax input').on('click', function(e){
e.preventDefault();
var form = $(this).parent();
$.ajax({
type: "POST",
url: 'my/ajax/url',
context: this,
cache: false,
dataType: 'json',
headers: { "cache-control": "no-cache" },
async: true,
crossDomain: true,
data: form.serialize(),
xhrFields: {
withCredentials: true
},
success: function(data)
{
alert('xhr success');
// parse show message to user according to server response.
},
error: function(jqXhr, textStatus, errorThrown) {
alert("Rate problem. Error: " + jqXhr.responseText + ", textStatus: " + textStatus + ", errorThrown: " + errorThrown)
},
complete: function(){
console.log('compete');
}
});
});
这是服务器响应代码的一部分:
$myResponse['error'] = false;
$myResponse['message'] = 'Everything is just fine';
if (isset($_SERVER['HTTP_ORIGIN'])) {
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
header('Access-Control-Allow-Methods: GET,PUT,POST,DELETE,OPTIONS');
}
header('Content-Type: application/json');
echo json_encode($myResponse);
exit(0);
它应该写成功,但它会警告速率问题。错误:未定义。文本状态:错误,错误抛出:
解决方案
我相信您正在本地计算机上进行测试。
当您在您的计算机上进行测试时,“my/ajax/url”指的是同一个域。因此,假设您的测试网站已打开http://localhost/mywebsite
,AJAX 将点击完整的绝对 URL,即“ http://localhost/mywebsite/my/ajax/url ”
在您的 iOS 上(我相信它是不同的设备,例如 iPhone/平板电脑/笔记本电脑/等),当 AJAX 尝试点击“ http://localhost/mywebsite/my/ajax/url ”时,它试图在同一设备(iphone/平板电脑/笔记本电脑/等),而不是托管网站的计算机。
所以:
- 确保您设置了正确的 URL。在 AJAX之前放置完整绝对 URL 的警报(如“ http://localhost/mywebsite/my/ajax/url ”,而不是“my/ajax/url”)。
- 在您的 PHP 中,将 this: 放入第一行
echo "hi from server"; exit;
,然后在您的 AJAX 成功函数中放入:alert(data);
检查您是否将 AJAX 发送到正确的 URL (#1),并从正确的服务器 (#2) 接收。
推荐阅读
- mysql - 无法在 WAMP 服务器上的 WordPress localhost 中选择数据库错误
- authentication - 使用 HMAC256 验证 JWT Token 时是否需要将 ValidateIssuerSigningKey 设置为 true?
- charts - 谷歌折线图。删除多余的网格线或更改其颜色
- javascript - ISBN 转换器工作但输入到输出出现问题
- vba - 循环检查单元格值是否满足条件
- reactjs - 启用和禁用上一个按钮通过 Reactjs 同时加载
- c++ - CUDA:三角括号在 Visual Studio 中给我一个错误
- python - Can't loop the distance between two locations. TypeError: 'numpy.float64' object is not iterable
- shell - 在 tcsh 中构建要执行的命令行(由 lsf)出现问题,变量和引号问题
- c# - 我的删除功能没有删除条目并且被忽略