Webix ajax 除了 IE,CORS 在任何地方都可以工作

Webix ajax with CORS working everywhere except IE

昨天早上,来自我创建的 webix 小部件的 AJAX 调用在 IE 中停止工作(已测试 IE10 和 11)。直到昨天早上它才与 IE 一起工作。

我已经从备份中恢复了昨天早上修改的 php 个文件,但仍然无法使用 IE 进行 AJAX 调用。我创建了一个 Webix 片段来帮助说明我遇到的问题 (http://webix.com/snippet/2047ef57)。

如果您在除 IE 之外的任何程序中单击 snippet/example 中的按钮,您将获得骨科诊所的膝外科医生名单。如果您尝试在 IE 中 运行 相同的代码,您会收到一条 "Script Error" 消息。

我已尝试使用 GET 和 POST 来发出此请求以避免我在网上阅读到的 IE 缓存问题。

有人对我可以尝试让我的 PHP 在 IE 中再次工作有什么建议吗?

根据 CORS 场景的 Webix 文档,您可以做两件事。你要么:

  1. 配置托管您的 PHP 文件的服务器,以便它允许来自另一个域的任何客户端从中获取数据

    http://docs.webix.com/desktop__crossdomain_loading.html

或者

  1. 更改您的 client-side 代码并通过 webix.jsonp() 方法使用 JSONP 技术 - 代码片段可以在我上面提供的 link
  2. 中找到

如果您可以访问 Web 服务器的配置以使用特定的 "Access-Control-Allow-Origin" header 响应 http 请求,则第一个选项是理想的。但如果你没有那么多控制权,那么第二项是你的选择

webix 库正在浏览器嗅探,并且使用 ActiveX 而不是 IE 的 XMLHttpRequest:

getXHR: function () {
    return webix.env.isIE
        ? new ActiveXObject("Microsoft.xmlHTTP")
        : new XMLHttpRequest;
}

如果您切换浏览器的用户代理字符串,从而破坏此浏览器检测,您会注意到跨域请求顺利通过。

您可以通过以下步骤确认这一点:

  1. 按 F12 打开开发者工具
  2. 切换到仿真选项卡 (Ctrl+8)
  3. 将用户代理字符串设置为 "Google Chrome"

此时标签会刷新。按下您的按钮,并注意收到的结果符合预期。

webix 正在做的这个测试应该首先检查 XMLHttpRequest 支持,如果存在就使用它。不推荐测试浏览器而不是功能的方法(从您的问题可以看出):

尝试添加以下内容以使用我们自己的测试覆盖此逻辑:

webix.ajax.prototype.getXHR = function () {
    return XMLHttpRequest
        ? new XMLHttpRequest
        : new ActiveXObject("Microsoft.xmlHTTP");
}

在线测试:http://webix.com/snippet/5e654155