【问题标题】:AJAX request hits server from every page and I can't find the source of that original AJAX callAJAX 请求从每个页面命中服务器,我找不到原始 AJAX 调用的来源
【发布时间】:2011-12-30 02:50:55
【问题描述】:

在我数千行 javascript 中的某处,正在进行 ajax 调用。我一生都无法弄清楚它是从哪里来的。它似乎在页面加载后立即发生。

我可以在 firebug 中看到正在进行 ajax 调用。 ajax 调用总是请求当前页面。因此,例如,一旦 users#new 加载,它就会请求 users#new.js,并且对所有其他控制器和操作也执行相同操作。

有没有一种方法可以确定它在代码中的哪个位置被调用?

【问题讨论】:

  • 根据所调用的控制器操作将其隔离
  • 它发生在每个页面/操作上
  • 我想你误会了。你说你可以在 Firebug 中看到一个 ajax 调用,对吧?因此,请检查该 ajax 调用中请求的路径,并将其隔离到某个控制器/操作。例如,如果 AJAX 调用命中服务器日志中的 /users/new 路径,那么它可能与 users#new 操作有关。这应该允许您隔离哪些 JS 代码可以进行该调用。
  • 我不清楚 :) ajax 调用总是请求当前页面。因此,一旦 users#new 加载,它就会要求 users#new.js 与所有其他控制器和操作相同。
  • 好吧,这不好:) 可能想要查看您的代码以查找未将 ajax 调用包含在 javascript 单击(或其他事件)处理程序中的区域。如果它发生在 DOM 加载时,那么它必须在不依赖于某个事件(点击、更改等)发生的情况下发生。

标签: javascript ruby-on-rails ajax ruby-on-rails-3


【解决方案1】:

尽管您已经找到了解决方案,但您仍然可以使用调试器来补救这种情况。假设您正在使用 jQuery 及其 AJAX 助手,只需在 $.ajax 方法的 first line 中设置断点即可。

当调用$.ajax 时,运行时将在断点处停止,您可以查看调用堆栈以确定调用的确切来源。

如果您直接使用 XMLHttpRequest 构造函数,而不是通过 jQuery 或其他包装器,则将原始 XMLHttpRequest 构造函数替换为虚拟实现,以跟踪其调用者。

function XMLHttpRequest() {
    this.open = function() {}; // ignore
    this.send = function() {
        debugger;
    };
}

在此重写实现的 send 方法中放置断点或以编程方式调用调试器,并且每当有人尝试实例化新的 XMLHttpRequest 对象并调用 send 方法时,您可以拦截调用并查看调​​用追踪以找出是谁打来的电话。

有很多很好的调试选项,比如 Firefox 的 Firebug,或者 Chrome 和 Safari 中的内置开发者工具。

【讨论】:

    【解决方案2】:

    在您的 JavaScript 控制台中,您可以使用自己的实现覆盖 XMLHttpRequest.send() 并在那里设置断点,以便在调用调试器时检查堆栈跟踪。

    var send = XMLHttpRequest.prototype.send;
    XMLHttpRequest.prototype.send = function () {
        send.apply(this, arguments); // set break point here
    };
    

    【讨论】:

      【解决方案3】:

      在某个时间点,我重新编写了我的 ajax 设置函数。

      $.ajax != $.ajaxSetup,很明显:)

      【讨论】:

        猜你喜欢
        • 2017-03-06
        • 1970-01-01
        • 2017-04-12
        • 1970-01-01
        • 2015-09-01
        • 2012-02-16
        • 2015-12-13
        • 2018-01-06
        • 1970-01-01
        相关资源
        最近更新 更多