【问题标题】:Why AJAX call is not working only on iOS, everywhere else it works great?为什么 AJAX 调用不仅在 iOS 上有效,在其他任何地方都有效?
【发布时间】:2019-10-27 19:58:12
【问题描述】:

我正在使用 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);

它应该写成功,但它会警告速率问题。错误:未定义。文本状态:错误,错误抛出:

【问题讨论】:

    标签: javascript php jquery ios ajax


    【解决方案1】:

    我相信您正在本地计算机上进行测试。

    当您在自己的计算机上进行测试时,“my/ajax/url”指的是同一个域。因此,假设您的测试网站位于http://localhost/mywebsite,AJAX 将点击完整的绝对 URL,即“http://localhost/mywebsite/my/ajax/url

    在您的 iOS 上(我相信它是不同的设备,例如 iPhone/平板电脑/笔记本电脑/等),当 AJAX 尝试点击“http://localhost/mywebsite/my/ajax/url”时,它会尝试在 同一设备中找到该 URL(iphone/平板电脑/笔记本电脑/等),而不是托管网站的计算机。

    所以:

    1. 确保您设置了正确的 URL。在 AJAXBEFOREAJAX 之前发出完整绝对 URL 的警报(如“http://localhost/mywebsite/my/ajax/url”,而不是“my/ajax/url”)。
    2. 在您的 PHP 中,在第一行输入:echo "hi from server"; exit;,在您的 AJAX 成功函数中,输入:alert(data);

    检查您是否将 AJAX 发送到正确的 URL (#1),并从正确的服务器接收 (#2)。

    【讨论】:

    • 您好,感谢您的回答。 “my/ajax/url”只是真实地址的文本替换。我在域上进行测试,并使用完整地址和相对地址进行测试,但在这两种情况下都无法正常工作:-/ 但还是谢谢你!
    • Op 表示他们在 Android 上进行了测试,因此他们很可能从在服务器上运行的真实 URL(而不是接口循环)进行测试。听起来他们也在电脑和手机上进行测试。 iOS 在 ajax 和缓存方面存在某些问题,因此请对此进行测试,看看这是否是 OP 的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2011-03-21
    相关资源
    最近更新 更多