Как выполнить jquery-действие перед загрузкой данных ajax-ом?

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

Аватар пользователя slavik.kz slavik.kz 6 марта 2012 в 23:22

Сделал модуль - ajax-селект, аналог Hierarhical Select-а, но есть необходимость выполнять действие во время смены селекта, до загрузки ajax-данных. Подскажите, как это можно сделать?
Ajax-элемент - стандартный

$form['select'][$input_name] = array(
        '#type' => 'select',
        '#options' => $options,
        '#ajax' => array(
                'callback' => 'mymodule_ajax_callback',
                'wrapper' => 'region',
                'method' => 'replace',
                'effect' => 'fade',
                'speed' => 'fast'
        ),
);

Пытаюсь навесить в 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?

Комментарии

Аватар пользователя boneg boneg 7 марта 2012 в 0:17
<?php
................
$form['select'][$input_name] = array(
    
'#type' => 'select',
    
'#options' => $options,
    
'#ajax' => array(
        
'callback' => 'mymodule_ajax_callback',
//Убираем метод из массива #ajax, он будет объявлен в калбеке
        
),
);
fucntion mymodule_ajax_callback($form$form_state) {

  

$commands = array();
//Выполняем алерт или любую другую функцию с помощью ajax_command_invoke()
  
$commands[] = ajax_command_alert('Алерт!');
//Ваш запланированный реплейс
  
$commands[] = ajax_command_replace('#region''Ваши данные');
  return array(
'#type' => 'ajax''#commands' => $commands);
}
?>

Таким образом на аякс-форму можно назначить любую последовательность команд.

Аватар пользователя slavik.kz slavik.kz 7 марта 2012 в 9:54

Что-то никак не дойду, а как вызвать не jquery-методы, а стороннюю функцию? (я вообще хочу обновлять gmap-карту при изменении иерархии регионов) или в ajax_command_replace myfunction в html-запускать?

Аватар пользователя boneg boneg 7 марта 2012 в 10:14

"slavik.kz" wrote:
Что-то никак не дойду, а как вызвать не jquery-методы, а стороннюю функцию?

jQuery плотно интегрирован в систему и дабы не изобретать велосипед - просто добавьте вашу функцию обновления карты как новый jQuery-метод.

в подключенном js-файле или inline-скрипте:

(function($) {
$.fn.gmapUpdate = function(data) {
//Тут ваши действия над картой исходя из значения data

};
})(jQuery);

В калбеке ajax:

<?php
fucntion mymodule_ajax_callback
($form$form_state) {

  

$commands = array();
//В качестве селектора указываем NULL, если не нужно привязывать метод к готовому элементу.
  
ajax_command_invoke(NULL'gmapUpdate', array('Параметры, которые передаются в data') );
  return array(
'#type' => 'ajax''#commands' => $commands);
}
?>
Аватар пользователя boneg boneg 7 марта 2012 в 10:25

"enemis" wrote:

Да юзайте ajax_command_after()

При чем тут?
ajax_command_before() и ajax_command_after() выполняют jQuery-функции after и before, которые просто вставят данные до или после элемента, а не выполняют команду до или после другого действия.

Аватар пользователя slavik.kz slavik.kz 7 марта 2012 в 11:22

пока сделал по второму комменту, буду смотерть остальные

//Выполняем алерт или любую другую функцию с помощью ajax_command_invoke()
$commands[] = ajax_command_before('#region', '<script>myfunction()</script>');
//Ваш запланированный реплейс
$commands[] = ajax_command_replace('#region', drupal_render($form['region']));
Аватар пользователя enemis enemis 7 марта 2012 в 13:23

"boneg" wrote:
ajax_command_before() и ajax_command_after() выполняют jQuery-функции after и before

Вы правы что то я натупил...Тему в закладки