Как повесить скрипт на элемент views после того как views перезагрузится через ajax?

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

Аватар пользователя engenes engenes 18 декабря 2016 в 15:50

Есть представление, в котором открыт фильтр по заголовку, после ввода слова, представление перезагружается через ajax, и перестает работать мой самописный аккордеон, знаю что есть готовый модуль. Но мне принципиально именно научиться вешать скрипты и после срабатывания ajax.
На скрине представление:
снимок.PNG
А это мой скрипт, которые сворачивает разворачивает элемент при клике по заголовку

$('.view-id-question_answer.view-display-id-page .views-field-title').click(function(){
   $(this).parents('.views-row').siblings().removeClass('active').find('.views-field-body').slideUp(200);
   if ($(this).parents('.views-row').hasClass('active')){
      $(this).parents('.views-row').removeClass('active').find('.views-field-body').slideUp(200);
   }else{
      $(this).parents('.views-row').addClass('active').find('.views-field-body').slideDown(200);
   }
})
ВложениеРазмер
Иконка изображения snimok.png131.45 КБ

Лучший ответ

Аватар пользователя bumble bumble 18 декабря 2016 в 17:29
1

А если так:

(function ($) {
  Drupal.behaviors.a_module = {
    attach: function (context, settings) {
      $('.view-id-question_answer.view-display-id-page .views-field-title').once().click(function () {
        $(this).parents('.views-row').siblings().removeClass('active').find('.views-field-body').slideUp(200);
        if ($(this).parents('.views-row').hasClass('active')) {
          $(this).parents('.views-row').removeClass('active').find('.views-field-body').slideUp(200);
        } else {
          $(this).parents('.views-row').addClass('active').find('.views-field-body').slideDown(200);
        }
      })
    }
  };
}(jQuery));

ЗЫ - ща наугад бью )))
ЗЫЫ - отредактировано по просьбе ТС.

Комментарии

Аватар пользователя bumble bumble 18 декабря 2016 в 16:23

Принципиально и учится - это хорошо!

Вот Вам материал для познаний:

В кратце - Вам нужно использовать скрипт внутри бихейворов Drupal (Drupal.behaviors).

Аватар пользователя engenes engenes 18 декабря 2016 в 16:31

Написал вот так, теперь при клике разворачивается и сразу сворачивается

(function ($) {
  Drupal.behaviors.a_module = {
    attach: function (context, settings) {
                $('.view-id-question_answer.view-display-id-page .views-field-title').click(function(){
                                $(this).parents('.views-row').siblings().removeClass('active').find('.views-field-body').slideUp(200);
                                if ($(this).parents('.views-row').hasClass('active')){
                                        $(this).parents('.views-row').removeClass('active').find('.views-field-body').slideUp(200);
                                }else{
                                        $(this).parents('.views-row').addClass('active').find('.views-field-body').slideDown(200);
                                }
                })
    }
  };
}(jQuery));
Аватар пользователя bumble bumble 18 декабря 2016 в 17:07

Попробуйте так:

(function ($) {
  Drupal.behaviors.a_module = {
    attach: function (context, settings) {
      $('.view-id-question_answer.view-display-id-page .views-field-title', context).once().click(function () {
        $(this).parents('.views-row').siblings().removeClass('active').find('.views-field-body').slideUp(200);
        if ($(this).parents('.views-row').hasClass('active')) {
          $(this).parents('.views-row').removeClass('active').find('.views-field-body').slideUp(200);
        } else {
          $(this).parents('.views-row').addClass('active').find('.views-field-body').slideDown(200);
        }
      })
    }
  };
}(jQuery));

Не тестил.

Аватар пользователя engenes engenes 18 декабря 2016 в 17:14

Потестил)) теперь работает, как обычно, то етсь только при загрузке страницы, после ajax нет, первый раз срабатывалос после ajax но по нажатию на заголовок функция срабатывала 2 раза, разворачивалась и сворачивалась, думаю это связано с тем что attach: function (context, settings) { запускает все внутри себя как бы два раза ну например при отправке запроса на сервер и при получении, если это так и я щас не бред написал\. то может есть способ однократного запуска, только при сукцессе?

Аватар пользователя bumble bumble 18 декабря 2016 в 17:29
1

А если так:

(function ($) {
  Drupal.behaviors.a_module = {
    attach: function (context, settings) {
      $('.view-id-question_answer.view-display-id-page .views-field-title').once().click(function () {
        $(this).parents('.views-row').siblings().removeClass('active').find('.views-field-body').slideUp(200);
        if ($(this).parents('.views-row').hasClass('active')) {
          $(this).parents('.views-row').removeClass('active').find('.views-field-body').slideUp(200);
        } else {
          $(this).parents('.views-row').addClass('active').find('.views-field-body').slideDown(200);
        }
      })
    }
  };
}(jQuery));

ЗЫ - ща наугад бью )))
ЗЫЫ - отредактировано по просьбе ТС.