JQuery Ajax 请求在 iPhone 设备浏览器上不起作用

问题描述 投票:0回答:7

我们正在开发一个 iPhone Web 应用程序,使用大量的 jquery AJAX 调用从 XML Web 服务中提取数据。在我的 Mac 上使用 Safari 进行开发和测试时,调用效果非常好。问题是,一旦我们在 iPhone 模拟器或实际设备上进行测试,我们就无法从网络服务中获取任何信息。

我已打开“开发”菜单并将“用户代理”更改为 Mobile Safari,看看这是否会产生影响,但它仍然适用于 PC 端。

我不认为这是跨站点限制,因为所有 ajax 调用等都是从同一服务器和端口号进行的。

有没有办法我们可以在模拟器上进行 javascript 调试来查看调用失败的地方?

谢谢, 德万

jquery iphone ajax
7个回答
6
投票

我遇到了同样的问题。

检查发送到 jQuery.ajax 函数的对象中的 url: 参数。将其从“http://the/full/url”缩短为“/just/the/relative/to/root/part”

对我来说,这似乎是 Safari Mobile 的 bug。


4
投票

您可以在 Mobile Safari 中启用 JavaScript 控制台。请参阅此处的说明。基本上是“设置”->“Safari”->“开发人员”->“调试控制台”。这适用于模拟器和实际设备。


1
投票

我在为网站编写 AJAX 聊天时遇到了同样的问题。问题是缓存。添加这行代码,问题就解决了。

$.ajaxSetup({ cache: false });

1
投票

就我而言,我仅从 iOS 浏览器没有 ajax POST 和 PUT 请求(即使从 iOS 设备浏览器,GET 和 DELETE 也能正常工作),并通过

async: false
禁用异步来解决问题,这使得 POST 和 PUT 请求从 iPhone Safari 发送。如果您对 GET 或 DELETE 请求有疑问,那么这可能不是答案。

async 选项默认为 true,以异步方式发送请求。

通过Web Inspector(设置->Safari->高级->Web Inspector)和Mac Safari开发功能调查此问题(通过USB线连接Mac和iPhone后,您可以从Mac Safari调试iOS Safari上的JavaScript) ,我看到只有当我在进入ajax函数之前通过断点保持请求流并在几秒钟后释放它以进入ajax函数时,才会发送ajax POST。只需阻塞请求流就可以解决 POST 和 PUT 请求问题。

我怀疑异步选项会导致跳过 POST 和 PUT 请求,因此我禁用了它。我知道这对于桌面浏览器来说并不是那么优选的解决方案,但发现这是目前唯一始终适用于 POST 和 PUT 的解决方案。

这是我的规格 -> iOS:14.7.1,jQuery:3.5.1

我使用 iPhone X 和 iPad(第 4 代)。这两款设备的 iOS 版本都是 14.7.1,这是目前最新的版本。

我也通过

cache: false
禁用了缓存,但仅通过禁用缓存我在 POST 和 PUT 上没有得到任何区别。也许禁用缓存是解决 GET 方法问题的方法。由于我从一开始就没有对 GET 和 DELETE 方法有任何问题,所以我无法判断。

$.ajax({
        url: '/relative-path/',
        type: 'POST',
        headers: { "CSRF-Token": token, "cache-control": "no-cache" },
        data: json_payload,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        cache: false,
        async: false,
            :

// GET method I used is
$.get('/relative-path', function(data, status){
    // data is from service.
            :

0
投票

好吧,我想我们已经解决了这个问题,尽管它仍然让我感到困惑。

如果我们在代码中的 onReady() 部分之后直接执行“虚拟”XMLHttpRequest,那么它似乎会“解锁”任何后续请求。

http = new XMLHttpRequest();

http.open("GET", "/getdata/dummy.xml);
http.onreadystatechange=function() {
    if(http.readyState == 4) {
        // alert(http.responseText);
    }
}
http.send(null);

如果我注释掉此代码块,则以下完全有效的 XML 请求将失败。再次强调,这仅在设备上,因为 Safari 和模拟器在没有此代码块的情况下也可以工作。

PS:dummy.xml 只是返回“无”


0
投票

我的答案是将 script 标签移到 head 标签中。


0
投票

我也有同样的问题。问题是ajax在iPhone上不起作用,正如“Steve Park”所说,通过处理

async: false
解决了这个问题。在我看来,
location.href
正在影响ajax行为。这是因为ajax调用后有一个
location.href
语句。 (当然我也不确定)

© www.soinside.com 2019 - 2024. All rights reserved.