Как программно вызвать нажатие на кнопку отправки формы с поддержкой 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.



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


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();
?>

событие клика сработало для меня, а событие mousedown - нет.
aross

0

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


Это то, что я попробовал сначала, и, похоже, он работает неправильно. Вот как я сюда попал.
aross
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.