Изменение ajax-запроса jQuery, перехваченного через ajaxSend()

Я использую ajaxSend() для перехвата запросов, исходящих от плагина jQuery на моей странице, а затем фильтрую нерелевантные запросы с помощью URL-адреса ajaxOptions.

$('some-selector').ajaxSend(function(e, xhr, settings) {
    var ajaxUrl = settings.url;
    if (ajaxUrl.search('targetpage.aspx') == 0) {
         //need to add an additional parameter to my request here
    } 
}

Мне нужно вставить дополнительный параметр в соответствующие запросы. Можно ли изменить запрос на этом этапе?

3 ответа

Вы можете добавить параметр в settings.data хэш, проверив, что он не равен нулю раньше:

if (settings.data == null) {
    settings.data = { };
}
settings.data['param'] = 'value';

или просто измените URL:

settings.url += (settings.url.match(/\?/) ? "&" : "?") + 'param=value';

Это старый вопрос, но я пришел сюда из Google и подумал, что другие люди, ищущие то же самое, должны иметь рабочее решение. Я попробовал предложенный ответ, но он не работает. Изменение данных в обработчике ajaxSend не меняет того, что отправляется.

Моя цель была такой же, как у OP, вставить дополнительный параметр в запросы.

Поэтому я придумал для этого хакерское решение: переопределить метод jQuery ajax. Просто замените "injected_param" и "injected_value" в соответствии с вашими потребностями. Я добавил несколько охранников, чтобы проверить, присутствует ли параметр или нет, на всякий случай.

$(function() {

        var jqAjax = $.ajax;
        $.ajax = function (settings, settingsObj) {

            if (typeof(settings) == "string") {
                settingsObj.url = settings;
                settings = settingsObj;
            }

            if (!settings.data) { 
                settings.data = {};
            }

            if (typeof(settings.data) == "string" && settings.data.indexOf("&injected_param=") < 0) {
                settings.data += "&injected_param=injected_value";
            }

            else if (!settings.data.injected_param) {
                settings.data.injected_param = "injected_value";
            }


            jqAjax (settings);
        };
    });

Или же:

//Interrupt AJAX requests and switch out the URL.
jQuery(document).bind('ajaxSend', function(event, xhr, params) {

    event.preventDefault();

    //Make sure this isn't one we've already modified, or it will loop infinitely
    if (!~params.url.search("http://www.example.com")) {

        //This is an untainted url, so change it.
        params.url = "http://www.example.com";

        //Send the request again with the new parameters.
        jQuery.ajax(params);
    }

    return false;
});
Другие вопросы по тегам