Jquery 如何在Drupal7中使自定义Ajax命令等待动画

Jquery 如何在Drupal7中使自定义Ajax命令等待动画,jquery,ajax,drupal,drupal-7,Jquery,Ajax,Drupal,Drupal 7,我试图构建一个定制的Ajax命令,用于Drupal7视图。该视图将在栅格中显示多个缩略图。单击一个缩略图,应在下一行中的一个div上滑下完整的节点内容。在处理新请求之前,单击另一个缩略图会向上滑动另一个节点。因为我找不到一种方法来操作标准的ajax命令,以防止在动画完成之前用ajax替换div,所以我尝试构建一个自定义ajax命令来控制流。现在,无论我做什么,每次单击缩略图都会出现匿名Ajax错误 发生AJAX HTTP错误。HTTP结果代码:500调试 信息如下。路径: [xxxxxxx].l

我试图构建一个定制的Ajax命令,用于Drupal7视图。该视图将在栅格中显示多个缩略图。单击一个缩略图,应在下一行中的一个div上滑下完整的节点内容。在处理新请求之前,单击另一个缩略图会向上滑动另一个节点。因为我找不到一种方法来操作标准的ajax命令,以防止在动画完成之前用ajax替换div,所以我尝试构建一个自定义ajax命令来控制流。现在,无论我做什么,每次单击缩略图都会出现匿名Ajax错误

发生AJAX HTTP错误。HTTP结果代码:500调试 信息如下。路径: [xxxxxxx].localhost/ajax reader/ajax/169/modal StatusText: 内部服务器错误响应文本:

这是我的模块代码,带有:

<?php

function ajax_reader_init() {
  drupal_add_js('misc/jquery.form.js');
  drupal_add_library('system', 'drupal.ajax');
}

/**
 * Implements hook_menu().
 */
function ajax_reader_menu() {
  // Menu callback for using ajax outside of the Form API
  $items['ajax-reader'] = array(
    'page callback' => 'ajax_link_response',
    'access callback' => 'user_access',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/**
 * Register a custom jquery ajax command.
 */
function ajax_reader_command_replace_work($item) {
  return array(
    'command' => 'replaceWork',
    'cont' => $item
  );
}

/**
 * Callback function.
 */
function ajax_link_response($type = 'ajax', $nid = 0) {
  $output = _ajax_reader_load_noder($nid);
  if ($type == 'ajax') {
    $commands = array();
    // Feeding the themed node to my custom ajax command
    $commands[] = ajax_command_replace_work($output);
    $page = array(
      '#type' => 'ajax',
      '#commands' => $commands
    );
    ajax_deliver($page);
  }
  elseif ($nid > 0) {
    drupal_goto('node/' . $nid);
  }
  else {
    $output = '<div id="content">' . $output . '</div>';
    return $output;
  }
}

/**
 * Helper function for returning a themed node
 */
function _ajax_reader_load_noder($nid = 0) {
  $node = node_load($nid, NULL, false);
  if ($node) {
    $vnode = node_view($node, $view_mode = 'modal');
    return theme("node", $vnode);
  }
}

我问题中的代码有效,事实上是我没有的问题的解决方案

作为参考,对于任何对这类问题感兴趣的人,我想回答我自己的问题,尽管这会让我成为一个非常愚蠢的程序员:)上面的代码工作完美,但在PHP方面有一个命名问题:引用自定义ajax命令的函数名是ajax\u reader\u command\u replace\u work()而不是ajax\u命令\u replace\u work()

就这样。希望有人会觉得这个有用

(function($, Drupal) {
/**
 * Register a custom jquery ajax command.
 */
  Drupal.ajax.prototype.commands.replaceWork = function(ajax, response, status) {
    // Checking if there is a div present to hide
    if ( $('#detail-view').length) {
        // Using promise() to make sure the slide animation is finished before replacing my content.
            $('#detail-view').slideUp('slow').promise().done(function() {
                $('#detail-view').replaceWith('<div id="detail-view">' + response.cont + '</div>');
                $('#detail-view').slideDown('fast');
          });
      // No #detail-view present to hide.
        } else {
            $(".view-portfolio .add-row").parents('tr').next().find('th').append('<div id="detail-view"></div>');
            $('#detail-view').replaceWith('<div id="detail-view">' + response.cont + '</div>');
            $('#detail-view').slideDown('fast');
        }
  }

})(jQuery, Drupal);