【问题标题】:Ajax call made by jQuery .load functionjQuery .load 函数进行的 Ajax 调用
【发布时间】:2010-09-27 20:19:15
【问题描述】:

问题在于浏览器实现简单调用的方式不同。使用 colorbox 扩展(facebox 变体)时会出现问题。使用 jquery load() 函数将内容加载到颜色框中。

当 Chrome 进行调用时,Accept 标头设置为:

Accept: text/html, */*, text/javascript

如果是 FireFox,标题如下所示:

Accept: text/javascript

我试图通过设置来强制接受标头:

jQuery.ajaxSetup({  
  'beforeSend': function (xhr) {xhr.setRequestHeader("Accept", "text/javascript")}  
}); 

在使用 $.ajax 调用时效果很好,但似乎不影响 .load 功能。任何 想知道如何解决这个问题?

【问题讨论】:

  • 您在哪里使用.load() 获取javascript?它用于获取内容,因此您最好使用不同的方法。
  • 实际上它的颜色框正在加载,除非没有其他方法,否则我宁愿不更改它的代码。这是未压缩的 jquery-colorbox.js gist.github.com/599891 的第 650 行附近的片段

标签: ruby-on-rails jquery ruby-on-rails-3 colorbox


【解决方案1】:

尽管直接使用$.ajax 调用来避免该问题显然更好,但您可以为$.ajax 方法创建代理方法。这很有帮助,因为$.load 又使用一组默认参数调用$.ajax。因此,我们可以拦截$.loads 对$.ajax 的调用。

var org = $.ajax;
$.ajax = function(settings){
    settings['accepts'] = null;
    settings['beforeSend'] = function(xhr) {
        xhr.setRequestHeader("Accept", "text/javascript");
    }
    org(settings);
}

 $("#foo").load("http://fiddle.jshell.net/FpCBJ/show/light/");

Try

显然,这会影响对$.ajax的所有调用,因此您可能需要在代理方法中添加另一个参数,该参数可以在代理中设置和检查,以避免在直接调用时设置requestheader。甚至在设置中。

我想您也可以为每个调用添加/删除代理,但这会增加开销并可能导致竞争条件(?)(如果您在请求后立即删除代理,则不会这样认为,不要等待回调),所以你需要某种锁。

编辑:添加settings['accepts'] = null; 以防止$.ajax 在回调之前添加任何标头,因为setRequestHeader() 仅添加,而不是替换。男孩,这很脏。

编辑 2:实际上,一个可能更简洁的选择是设置您自己的接受并引用它们以允许 $.ajax 完成其工作以映射数据类型并自行设置 XHR:

var org = $.ajax;
$.ajax = function(settings){
    settings['accepts'] = {"myDataType" : "text/javascript"};
    settings['dataType'] = "myDataType";
    org(settings);
}

 $("#foo").load("http://fiddle.jshell.net/FpCBJ/show/light/");

【讨论】:

    猜你喜欢
    • 2011-01-12
    • 2021-09-07
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 2011-11-27
    • 2014-07-24
    相关资源
    最近更新 更多