Есть представление, в котором открыт фильтр по заголовку, после ввода слова, представление перезагружается через ajax, и перестает работать мой самописный аккордеон, знаю что есть готовый модуль. Но мне принципиально именно научиться вешать скрипты и после срабатывания ajax.
На скрине представление:
А это мой скрипт, которые сворачивает разворачивает элемент при клике по заголовку
$(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.png | 131.45 КБ |
Комментарии
Принципиально и учится - это хорошо!
Вот Вам материал для познаний:
В кратце - Вам нужно использовать скрипт внутри бихейворов Drupal (Drupal.behaviors).
Написал вот так, теперь при клике разворачивается и сразу сворачивается
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));
С бихэйвором часто нужно использовать once, чтобы обработчик не биндился на событие многократно.
в какое место нужно приписать once?
или вариант ответа на вопрос дать
Попробуйте так:
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));
Не тестил.
Потестил)) теперь работает, как обычно, то етсь только при загрузке страницы, после ajax нет, первый раз срабатывалос после ajax но по нажатию на заголовок функция срабатывала 2 раза, разворачивалась и сворачивалась, думаю это связано с тем что attach: function (context, settings) { запускает все внутри себя как бы два раза ну например при отправке запроса на сервер и при получении, если это так и я щас не бред написал\. то может есть способ однократного запуска, только при сукцессе?
А если так:
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));
ЗЫ - ща наугад бью )))
ЗЫЫ - отредактировано по просьбе ТС.
Оставьте в своем ответе последний вариант) Благодарю)