2010-02-25 83 views
2

我使用ajaxSend()来拦截源于我的页面上的jQuery插件的请求,然后使用ajaxOptions url过滤不相关的请求。修改通过ajaxSend拦截的jQuery ajax请求()

$('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 
    } 
} 

我需要插入一个额外的参数到相关的请求。目前是否可以修改请求?

+0

是的,这是可能的,因为'Ajax调用由 – 2017-11-14 12:25:35

回答

3

你可以通过检查,它不为空追加参数为settings.data哈希前:

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

或者只是修改URL:

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

达林之前ajaxSend'被触发时,我尝试过我的附加参数settings.url(没有成功)我发布了这个问题。虽然我使用了一种解决方法来解决我最初的问题(我在发送请求之前挂钩了插件以修改url),但我仍然想知道为什么我要用这种方法画空白。 – 2010-02-25 07:43:25

+0

这不起作用,因为ajaxSend中的数据是查询字符串而不是对象,所以应该如下所示:if(settings.data)settings.data + =“&”; settings.data + =“param = value”; – Enrique 2012-01-14 17:11:59

2

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

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

所以我设计了一个黑客解决方案:覆盖jQuery的ajax方法。 只需替换“inject_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); 
     }; 
    }); 
+0

认为jQuery文档不推荐这样做,所以实现$ .ajaxSetup()(http://api.jquery.com/jQuery.ajaxSetup/)来拦截传出的AJAX请求以修改它们而不是覆盖核心jQuery功能。 – 2014-06-09 22:08:20

+0

你好,@Glen!我记不清这段代码的确切含​​义,因为它是从2年前开始的,但是从我引用的文档中看到,'ajaxSetup'允许我为'$ .ajax'调用设置默认值,而不是为提供给'$ .ajax'调用的数据的顶部添加新数据。这个功能的最佳人选是'ajaxSend',(2年前)它不适用于修改ajax请求的数据,所以我不得不设计这个黑客。我不知道它是一个错误还是设计,以及它是否适用于最新的jQuery版本,但那是当时的解决方案。 – NothingsImpossible 2014-06-10 02:24:55

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