Сделал модуль - ajax-селект, аналог Hierarhical Select-а, но есть необходимость выполнять действие во время смены селекта, до загрузки ajax-данных. Подскажите, как это можно сделать?
Ajax-элемент - стандартный
Пытаюсь навесить в drupal_add_js скриптом:
jQuery('#select').change(function () {alert('1');});
Работает, но только 1 раз - до изменения DOM-а AJAX-ом, это понятно, делаю так (live, delegate):
jQuery("#select").live("change", function(event){alert('1');});
не работает, а если на неиспользуемое событие - jQuery("#select").live("hover", function(event){alert('1');}); - работает
То есть ajax-действия, забинденные на элемент выполняются раньше и до моих не доходит очередь (если unbind сделать сначала - получается, но перестает работать ajax)
Может можно сделать unbind, но сохранить коллбеки, чтобы после бинда моих функций вернуть фукнции ajax?
Комментарии
<?php
$commands = array();
................
$form['select'][$input_name] = array(
'#type' => 'select',
'#options' => $options,
'#ajax' => array(
'callback' => 'mymodule_ajax_callback',
//Убираем метод из массива #ajax, он будет объявлен в калбеке
),
);
fucntion mymodule_ajax_callback($form, $form_state) {
//Выполняем алерт или любую другую функцию с помощью ajax_command_invoke()
$commands[] = ajax_command_alert('Алерт!');
//Ваш запланированный реплейс
$commands[] = ajax_command_replace('#region', 'Ваши данные');
return array('#type' => 'ajax', '#commands' => $commands);
}
?>
Таким образом на аякс-форму можно назначить любую последовательность команд.
Да юзайте ajax_command_after()
Что-то никак не дойду, а как вызвать не jquery-методы, а стороннюю функцию? (я вообще хочу обновлять gmap-карту при изменении иерархии регионов) или в ajax_command_replace myfunction в html-запускать?
jQuery плотно интегрирован в систему и дабы не изобретать велосипед - просто добавьте вашу функцию обновления карты как новый jQuery-метод.
в подключенном js-файле или inline-скрипте:
$.fn.gmapUpdate = function(data) {
//Тут ваши действия над картой исходя из значения data
};
})(jQuery);
В калбеке ajax:
<?php
$commands = array();
fucntion mymodule_ajax_callback($form, $form_state) {
//В качестве селектора указываем NULL, если не нужно привязывать метод к готовому элементу.
ajax_command_invoke(NULL, 'gmapUpdate', array('Параметры, которые передаются в data') );
return array('#type' => 'ajax', '#commands' => $commands);
}
?>
При чем тут?
ajax_command_before() и ajax_command_after() выполняют jQuery-функции after и before, которые просто вставят данные до или после элемента, а не выполняют команду до или после другого действия.
пока сделал по второму комменту, буду смотерть остальные
$commands[] = ajax_command_before('#region', '<script>myfunction()</script>');
//Ваш запланированный реплейс
$commands[] = ajax_command_replace('#region', drupal_render($form['region']));
Вы правы что то я натупил...Тему в закладки