1

我正在尝试对一些我没有编写的代码进行故障排除,并且在试图弄清楚为什么 Ajax 返回没有触发回调时遇到了很多困难。以下是将行为附加到 ajax 函数的代码:

  # Callback before AJAX request sends
cbBeforeSend = (jqXHR, settings) ->
  console.log jqXHR
  # initialize message/status elements
  $flashIcon.attr 'class', 'icon icon-refresh icon-spin'
  $flashError.html ''
  $flashNotice.html ''

# Callback when AJAX returns with success
cbSuccess = (data, textStatus, jqXHR) ->
  console.log 'success'
  $flashIcon.attr 'class', 'icon icon-ok-sign'
  window.globalLoadCallback()

# Callback when AJAX returns with error
cbError = (jqXHR, textStatus, errorThrown) ->
  console.log 'error'
  $flashIcon.attr 'class', 'icon icon-remove-circle'
  # Run the response javascript, even when the status indicates an error
  if /text\/javascript/.test jqXHR.getResponseHeader('Content-Type') 
    eval jqXHR.responseText

# Callback when AJAX returns
cbComplete = (jqXHR, textStatus) ->
  console.log 'cbComplete'
  if $flashIcon.is('.icon-refresh')
    $flashIcon.attr 'class', 'icon icon-warning-sign'

我们的应用程序有两个指向报价/报价路径的链接:

新的报价链接有效并触发了我上面显示的“成功”和“cbComplete”回调。这是该链接的代码:

<li>
  <%= link_to new_quoting_quote_path, remote:true do %>
    <i class="icon icon-plus-sign"></i>
    <span>New Quote</span>
  <% end %>
</li>

编辑报价链接有效,它将您带到正确的部分并且对象在控制台中返回,但“成功”和“cbComplete”回调没有触发(错误也没有)。只有“cbBeforeSend”回调被触发,因为 flashIcon 上的类仍然是“icon icon-refresh icon-spin”。我不认为 crm_connection 有问题,因为在浏览器中链接呈现为“/quoting/quotes/183/edit”。似乎提供了正确的 ID。这是该链接的代码:

<%= client_management_tab 'Health', edit_quoting_quote_path(@crm_connection) %>

抱歉,我无法提供更多细节。不幸的是,我没有编写这段代码,只是负责修复它。感谢您提供任何帮助。

我相信这是附加请求的代码:

  $flashInfo   = $('div.flash-info')
  $flashIcon   = $flashInfo.find('i#ajax-status')
  $flashError  = $flashInfo.find('#flash-error')
  $flashNotice = $flashInfo.find('#flash-notice')
  $(document).bind 'ajax:beforeSend', cbBeforeSendBound
  $(document).bind 'ajax:success', cbSuccessBound
  $(document).bind 'ajax:error', cbErrorBound
  $(document).bind 'ajax:complete', cbCompleteBound

$.ajaxSetup(
  beforeSend: cbBeforeSend
  success: cbSuccess
  error: cbError
  complete: cbComplete
  )
4

2 回答 2

0

如果对 jQuery.ajax 的实际调用设置了它自己的回调,那么我相当肯定它会忽略 ajaxSetup 提供的那些。这使得它们除了设置默认值之外的任何事情都非常不可靠,正如 Ricardo 在他的回答中指出的那样,jQuery 开发人员建议不要使用这种机制。

在我看来,你有几个选择。jQuery 还提供了一系列其他用于全局 ajax 事件绑定的 ajax 函数:

jQuery.ajaxStart、jQuery.ajaxStop、jQuery.ajaxComplete、jQuery.ajaxError、jQuery.ajaxSuccess、jQuery.ajaxSend

如果您使用这些函数绑定事件,那么它们将始终由 ajax 调用通过 jQuery 调用,但是这也可以通过在实际 ajax 请求中设置选项“global:false”来覆盖。

如果您是这种情况,那么您几乎被 Ricardo 的回答所困扰:修改对 jQuery.ajax 的实际调用以进行绑定。

于 2013-08-16T09:17:47.250 回答
0

来自 ajaxSetup 的 jQuery 文档:

Description: Set default values for future Ajax requests. Its use is not recommended.

我建议您更改呼叫并将回调分配给您的特定 ajax 请求:

jQuery.ajax
    url: 'blah/blah',
    success: cbSuccess,
    error: cbError,
    etc
于 2013-07-17T19:53:28.677 回答