Не может делать междоменные запросы без jQuery

-1

Я работаю над веб-проектом, где использование jQuery (или других библиотек/зависимостей) не является вариантом, поэтому я пытаюсь реплицировать использование кода jQuery для выполнения запросов AJAX. В проекте ранее использовался jQuery, поэтому я структурировал свою замену методу $.ajax(), чтобы иметь такое же поведение, однако я не могу заставить мои делать междоменные запросы. Например, при попытке загрузить скрипты я получаю эту ошибку в консоли.

XMLHttpRequest cannot load <URL>. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin <URL> is therefore not allowed access.

Я знаком с CORS и всей политикой безопасности, основанной на перекрестном происхождении, и что это влечет за собой, но то, о чем я смущен, - это то, как jQuery может показаться обходящим, в то время как мой код не может. Я думаю, что должно быть что-то особенное, что делает jQuery?

Вот как моя функция замены $.ajax() в настоящее время написана сценарием.

function ajax (options) {
    var request = new XMLHttpRequest();
    if ("withCredentials" in request)
        request.withCredentials = false;
    else if (typeof XDomainRequest !== "undefined")
        var request = new XDomainRequest();

    options.type = options.type || options.method || "GET";
    request.open(options.type.toUpperCase(), options.url, true);

    for (var i in options.headers) {
        request.setRequestHeader(i, options.headers[i]);
    }

    if (typeof options.beforeSend == "function")
        var go = options.beforeSend(request, options);

    if (go == false)
        return false;

    request.onreadystatechange = function () {
        if (this.readyState === XMLHttpRequest.DONE) {
            var resp = this.responseText;
            try {
                var body = JSON.parse(resp);
                this.responseJSON = body;
            }
            catch (err) {
                var body = resp;
            }

            if (this.status < 300 && typeof options.success == "function")
                options.success(body, this.status, this);
            else if (typeof options.error == "function")
                options.error(this, this.status, body);

            if (typeof options.complete == "function")
                options.complete(this, this.status);
        }
    };

    if (typeof options.data == "object" && options.data !== null)
        options.data = JSON.stringify(options.data);

    if (options.type.toUpperCase() != "GET")
        request.send(typeof options.data !== "undefined" ? options.data : null);
    else
        request.send();

    return request;
}

Может ли кто-нибудь указать, не хватает ли я чего-то очевидного? Нужно ли мне также вручную делать ОПЦИИ перед полетом или что-то еще?

  • 0
    Поскольку кто-то может упомянуть об этом, я должен указать, что у меня нет контроля над сервером, к которому я делаю междоменные запросы в этом случае. Я пытаюсь загрузить междоменные сценарии, поэтому на сервере не будет возможности сделать что-то вроде настроек «Access-Control-Allow-Origin» на «*».
  • 6
    Был ли предыдущий код с использованием JSONP, где URL-адрес ресурса загружался через тег script? Проверьте старый код, чтобы увидеть, использует ли он dataType:'jsonp' в параметрах $.ajax() , если это так, вам придется изменить код для обработки этого типа запроса.
Показать ещё 2 комментария
Теги:

1 ответ

0

Я нашел исправление для этого. Проблема, похоже, связана с попыткой загрузки в междоменные скрипты. jQuery использует $.getScript() для этого, что фактически просто добавляет скрипт на страницу вместо того, чтобы делать междоменный HTTP-запрос.

Я использовал этот код для замены этой функции.

function getScript (url, callback) {
    var loadScript = function (url, callback) {
        var scrpt = document.createElement("script");
        scrpt.setAttribute("type", "text/javascript");
        scrpt.src = url;
        scrpt.onload = function () {
            scrpt.parentNode.removeChild(scrpt);
            console.log("Script is ready, firing callback!");
            if (callback)
                callback();
        };

        document.body.appendChild(scrpt);
    }

    var isReady = setInterval(function () {
        console.log(document.body);
        if (document.body) {
            clearInterval(isReady);
            loadScript(url, callback);
        }
    }, 25);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню