修改通过ajaxSend()拦截的jQuery ajax请求

时间:2010-02-25 07:16:23

标签: jquery ajax

我正在使用ajaxSend()拦截源自我页面上的jQuery插件的请求,然后使用ajaxOptions url过滤不相关的请求。

$('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 个答案:

答案 0 :(得分:4)

您可以通过在以下之前检查它是否为null来将参数附加到settings.data哈希:

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

或只修改网址:

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

答案 1 :(得分:2)

这是一个老问题,但我是从谷歌来到这里的,并认为搜索相同内容的其他人应该有一个可行的解决方案。我已经尝试了建议的答案,但它不起作用。修改ajaxSend处理程序中的数据不会改变发送的内容。

我的目标与OP相同,在请求中插入一个额外的参数。

所以我为它设计了一个hacky解决方案:覆盖jQuery的ajax方法。 只需替换“inject_param”和“inject_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);
        };
    });

答案 2 :(得分:0)

或者:

//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;
});