javascript - 不需要响应的跨域 AJAX?

标签 javascript ajax

我想进行一个不需要响应的跨域 AJAX 调用(它只是为了收集数据)。我知道 JSONP,您可以在其中插入脚本标记,但由于我不会返回任何 JSONP,所以我想也许有更好的方法。是否仍需要使用相同的方法?

最佳答案

如果您控制目标域(收集数据的域)

您可能希望允许“外部”来源,以便您可以使用普通的 XMLHttpRequests 访问它。

在 Apache .htaccess 中类似于(需要 mod_headers):

Header set Access-Control-Allow-Origin *

或者在 PHP 中:

header('Access-Control-Allow-Origin: *');

实际上在 IE8+ 中,跨域 XmlHttpRequests 使用一个特殊的专有接口(interface) (XDomainRequest),jQuery(我最后一次检查)没有规范化。因此,您需要实现自定义 Ajax 传输 以使 jQuery 与 XSS Ajax 一起工作。那将是这样的:

if (window.XDomainRequest) {
    $.ajaxTransport(function (options, originalOptions, jqXHR) {
        var xdr;
        if (window.location.host != options.url.match(/:\/\/(.[^\/]+)/)[1]) {
            return {
                send: function (headers, completeCallback) {
                    xdr = new XDomainRequest();
                    xdr.onload = function () {
                        var responses = {
                            text: xdr.responseText
                        };
                        completeCallback(200, 'success', responses);
                    };
                    xdr.onerror = xdr.ontimeout = function () {
                        var responses = {
                            text: xdr.responseText
                        };
                        completeCallback(400, 'failed', responses);
                    };

                    xdr.open(options.type, options.url);
                    xdr.send(options.data);
                },
                abort: function () {
                    if (xdr) {
                        xdr.abort();
                    }
                }
            };
        }
    });
}

(我实际在生产中使用它,它应该可以工作)


如果您无法控制目标域

任何请求资源(无论是图像、页面还是脚本)的东西都会执行。

脚本可能仍然是“最轻”的选项,因为它不被渲染(因此不需要任何样式来隐藏它并且在任何情况下都不会导致任何重排)。

var req = document.createElement('script');
req.setAttribute('src', '//example.com/api/count?' + encodeURI('id=1&data=foo bar'));
document.body.appendChild(req);
document.body.removeChild(req);

限制: 如果您无法控制调用返回的内容,并且调用返回无效的 javascript,并且您在页面上的其他代码之前执行此代码,则某些浏览器的 javascript 解释器可能会被中断(取决于问题的严重程度)此无效代码导致的错误)。

另请注意,如果您无法控制目标域,并且目标域不值得信任,他们实际上可能会向站点注入(inject)令人讨厌的不良 javascript 并做出令人讨厌的坏事。讨厌。

关于javascript - 不需要响应的跨域 AJAX?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13362981/

相关文章:

javascript - jQuery ajaxForm "h is undefined"问题

javascript - 如何将javascript对象从一个页面发送到另一个页面?

javascript - 无法取消绑定(bind) jQuery 自定义事件处理程序

javascript - 现在我有一个包含文本和表格的html表单,我想在一个简单的文本文件中保存和检索数据,如何实现?

javascript - 从一行后面显示两个文本元素

c# - 我需要为 ASP.NET MVC 编写 Ajax 的技巧

php - 使用 ajax 更新不适用于数据表和 codeigniter

ajax - 如何在用户脚本中发送和检索跨域ajax数据

php - 如何使用 jQuery 和 CakePHP 更新 <div>?

c# - 将具有嵌套属性的 javascript 对象发布到 MVC