Как программно вызвать нажатие на кнопку отправки формы с поддержкой AJAX?

25

Я пытаюсь программно (с помощью jQuery) вызвать нажатие кнопки с поведением AJAX в форме Drupal, но пока jQuery('#edit-submit').click()ничего не делает.

Реальной мыши на этой кнопке работает , как предполагалось. Есть идеи, как заставить это работать?

Даниил
источник
Если это кнопка # edit-submit, вы не можете просто сделать $ ('form'). Submit ()?
cam8001
это не сработало для меня тоже. Он либо отправляет форму не AJAX-способом, либо ничего не делает, зависит от некоторых настроек в конструкторе форм.
Даниил

Ответы:

40

jQuery('#edit-submit').mousedown() - видимо, есть большая разница.

Даниил
источник
3
у меня не работает
ram4nd
Это решение сработало для меня. Нажатие на кнопку выполнило вызов ajax, но .click () или его варианты не помогли .mousedown () работает отлично.
Эрик Гудвин
Я бы не использовал селектор идентификатора на элементах формы. Если форма перестраивается во время обратного вызова AJAX, идентификаторы всех элементов изменятся, и ваш селектор jQuery больше не будет работать.
Юрий Бабенко
Именно то, что сказал Эрик. Я хотел бы знать, почему есть разница ... серьезно, это, кажется, не имеет смысла.
Джонатан Элмор
@JohnathanElmore mousedown()- это просто «первая часть» click()события, которое завершается, когда mouseup()происходит. Когда вы нажимаете на ссылку, а затем отпускаете мышь за пределами области ссылки, click()она обычно не срабатывает, и ссылка не переходит. Возможно, вызов ajax предотвращает mouseup()
запуск
7

На самом деле, не нужно догадываться.

Вы должны использовать Drupal поведения

Drupal.behaviors.yourFunctionName = {
    attach:function (context, settings) {

       // Your code goes here....

    }
}

Это даст вам доступ к свойству ajax настроек,

Drupal.behaviors.yourFunctionName = {
    attach:function (context, settings) {

       console.log(settings.ajax);

    }
}

В зависимости от вашей конфигурации вы должны увидеть список запускающих элементов с различными свойствами, такими как имя функции обратного вызова, идентификатор селектора, а также имя инициирующего события.

Затем вы можете использовать соответствующую информацию для запуска вашего мероприятия.

// $(selector).trigger(eventName);
// for example...
$('#edit-product-id-15', context ).trigger('change');
Патрикс
источник
2
Мне нравится этот ответ, потому что он предлагает интересную технику, чтобы узнать, как взаимодействовать с сгенерированными элементами для разработчиков не-Drupal, которые могут работать над проектом Drupal. +1
Лестер Пибоди
6

Создайте AJAX отправить, как показано ниже.

 $form['button'] = array(
    '#type' => 'button',
    '#value' => 'Click',
    '#ajax' => array(
      'callback' => '_kf_reading_user_points',
      'wrapper' => 'reading-user-points',
      'method' => 'replace',
      'event' => 'click',
    ),
  );

function _kf_reading_user_points(&$form, &$form_state) {
  // Something within the callback function.
}

Тогда событие jquery .click () будет работать в форме drupal ajax.

Leopathu
источник
Можете
1
Добавлена ​​функция обратного вызова :)
Leopathu
3

Вы также можете использовать .trigger()метод jQuery.$('#element').trigger('click');

BEEBEE
источник
3

В моем случае вышеупомянутые рекомендуемые решения не работали для меня, но упоминание .mousedown () привело к следующей идее, которая работала для меня (Drupal 7):

$('#custom-submit-button').click(function() {
  $('#ajax-submit-button').trigger('mousedown');
});

Есть некоторая полезная справочная информация о том, «почему», это случай в справочнике по API формы под #ajax_prevent

Дэвид Ньюкерк
источник
Мне не нужна оболочка click (), но ссылка на предотвращение ajax была КЛЮЧОМ!
Райан Хартман
2

Взглянув на модуль Better Exposed Filters, они отправляют форму AJAX, находя $ (. Ctools-auto-submit-click ') и инициируя щелчок.

<?php
// ... near line 190 of better_exposed_filters.js

// Click the auto submit button.
$(this).parents('form').find('.ctools-auto-submit-click').click();
?>
user27147
источник
событие клика сработало для меня, а событие mousedown - нет.
aross
0

Вы должны вызвать submitсобытие в форме. Clickи mousedownсобытия на кнопках не работают.

Каталин Мотату
источник
Это то, что я попробовал сначала, и, похоже, он работает неправильно. Вот как я сюда попал.
aross