在回调函数中访问jQuery Ajax请求的URL

时间:2011-03-29 05:35:34

标签: javascript jquery ajax

使用jQuery执行Ajax请求时,有没有办法看到所请求的URL?

如,

var some_data_object = { ...all sorts of junk... }
$.get('/someurl.php',some_data_object, function(data, textStatus, jqXHR) {
   var real_url = ? # <-- How do I get this
})

如何访问jQuery实际用于发出请求的URL?也许是jqHXR的一些方法/属性?我在文档中找不到它。

感谢。

6 个答案:

答案 0 :(得分:76)

在成功方法中设置断点,然后观察

this.url

是请求的真实网址。

答案 1 :(得分:16)

这是一个可能的解决方案:

  1. 通过实现beforeSend回调函数,在之前捕获ajax调用将其发送到服务器。
  2. 保存网址和数据
  3. 在您生成的错误消息中报告。

    var url = "";
    
    $.ajax({
      url: "/Product/AddInventoryCount",
      data: { productId: productId, trxDate: trxDate, description: description, reference: reference, qtyInCount: qtyInCount }, //encodeURIComponent(productName)
      type: 'POST',
      cache: false,
      beforeSend: function (jqXHR, settings) {
        url = settings.url + "?" + settings.data;
      },
      success: function (r) {
        //Whatever            
      },
      error: function (jqXHR, textStatus, errorThrown) {
        handleError(jqXHR, textStatus, errorThrown, url);
      }
    });
    
    function handleError(jqXHR, textStatus, errorThrown, url) {
       //Whatever
    }
    

答案 2 :(得分:8)

使用$.ajaxPrefilter

// Make sure we can access the original request URL from any jqXHR objects
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
  jqXHR.originalRequestOptions = originalOptions;
});

$.get(
  'http://www.asdf.asdf'
).fail(function(jqXHR){
  console.log(jqXHR.originalRequestOptions);
  // -> Object {url: "http://www.asdf.asdf", type: "get", dataType: undefined, data: undefined, success: undefined}
});

http://api.jquery.com/jQuery.ajaxPrefilter/

答案 3 :(得分:2)

似乎ajaxSend全局处理程序(http://api.jquery.com/ajaxSend/)在其settings参数中提供了url。您可以存储从xhr对象到ajaxSend回调中的url的映射,然后在成功回调中查找它给出的xhr对象。

var mappings = {};

$.ajaxSend(function(event, xhr, settings) {
   mappings[xhr] = settings.url;
});

$.ajax({
  url: "http://test.com",
  success: function(data, textStatus, xhr) {
    console.log("url = ", mappings[xhr]);
    delete mappings[xhr];
  }
});

这样做的好处是不必修改每个$ .ajax()对象。

答案 4 :(得分:1)

我也无法在文档中找到它。也许只需通过“代理”包装器将其添加到jqXHR对象,如...

我没有测试过,所以你可能需要打电话 $.param()并连接到网址。见http://api.jquery.com/jQuery.param/

var myGet = function(url, data, success) {
    $.get(url, data, function(data, textStatus, jqXHR) {
       jqXHR.origUrl = url; // may need to concat $.param(data) here
       success(data, textStatus, jqXHR);
    });
}

用法:

var some_data_object = { ...all sorts of junk... }
myGet('/someurl.php',some_data_object, function(data, textStatus, jqXHR) {
   var real_url = jqXHR.origUrl;
})

答案 5 :(得分:0)

仅供参考,作为airbai评论的补充 - 我无法在他的回答中发表评论, - 您可以将自己的数据添加到调用中并在回调中检索它。这样您就不必解析URL。

在这个示例JSONP请求中,我添加了变量element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.xpath, addToCartXpath))) (使用jQuery 3.2测试):

 element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "fybAddCartEvent")))

 element.click()