как обрабатывать AJAX Link только один раз?

Главные вкладки

Аватар пользователя rgba rgba 23 ноября 2012 в 13:55

Добрый день! Есть форма которая подгружается Ajax Link (код ниже). Но если кликнуть после отработки AJAX по ссылке ещё раз, форма подгружается 2 и более раз, как заблокировать повторную обработку AJAX Link, а потом снова разблокировать когда это будет нужно? Обработчик вешается непосредственно на обьект?Пробовал удалять классы, href'ы всёравно обрабатывается.


<?phpfunction myfeedback_menu() {
    $items = array();
    $items['ajax_link_callback'] = array(
        'page callback' => 'ajax_link_response',
        'access callback' => 'user_access',
        'access arguments' => array('access content'),
        'type' => MENU_CALLBACK,
    );

    return $items;
}

function ajax_link_response($type = 'ajax') {
    $form = drupal_get_form('myfeedback_form');
    if ($type == 'ajax') {
        $output = drupal_render($form);
        $commands = array();
        $commands[] = ajax_command_append('.region-feedback', $output);
        $commands[] = myfeedback_ajax_command_feedbackShow();
        $page = array('#type' => 'ajax', '#commands' => $commands);
        ajax_deliver($page);
    }
    else {
        return $form;
    }
}
?>

Комментарии

Аватар пользователя gorr gorr 23 ноября 2012 в 19:26

Думаю тут проще было бы свой обработчик ajax на ссылку повесить, который при клике по ссылке будет отключать повторную подгрузку на некоторое время или до выполнения определенного условия.
Типа

(function ($) {
  Drupal.behaviours.myAjaxLink = function() {
    attach: function(context, settings) {
      $('.my-ajax-link-class).click(function() {
        if(myCondition()) {
          $.ajax(function()...);
        }
        return false;
      });
    }
  }
})(jQuery);
Аватар пользователя mbaev mbaev 22 января 2016 в 17:36

Думается мне, что ajax обработчик на ссылку вы навешиваете сами. В таком случае обработчик нужно обернуть в функцию once

$('a.your-link').once(function(){
  // your handler.
});

Или же вы можете просто добавить к ссылке класс "use-ajax" и тогда drupal решит все ваши проблемы.

Аватар пользователя mozh mozh 26 января 2016 в 14:46

где то видел что нужно использовать параметр текущего контекста $('.my-ajax-link-class).click(function(context) {

(function ($) {
  Drupal.behaviours.myAjaxLink = function() {
    attach: function(context, settings) {
      $('.my-ajax-link-class).click(function(context) {
        if(myCondition()) {

          $.ajax(function()...);
        }
        return false;
      });
    }
  }
})(jQuery);

Аватар пользователя mbaev mbaev 26 января 2016 в 14:53

Можно использовать контекст. Но немного по-другому.

(function ($) {
  Drupal.behaviors.myAjaxLink = {
    attach: function (context, settings) {
      var $link = $(context).find('.my-ajax-link-class');
      if ($link.length) {
        $link.click(function (context) {
          $.ajax(function () {
            /*...*/
          });
          return false;
        });
      }
    }
  };
})(jQuery);

ЗЫ: У вас в коде синтаксические ошибки.

Аватар пользователя mozh mozh 26 января 2016 в 14:57

mbaev wrote:

ЗЫ: У вас в коде синтаксические ошибки.

код из первого коммента, я только context добавил параметр