Как отправить ajax drupal форму, используя javascript
Во -первых, я попробовал там решение Amar Ravikumar, но оно все еще не работает.
У меня есть этот кусок кода:
$form['button'] = array(
'#type' => "button",
'#id' => "mymoduleAjaxButton",
'#value' => t("Process"),
'#ajax' => array(
'callback' => "mymodule_form_callback",
'wrapper' => "message",
'method' => "html",
),
);
И у меня есть холст, который содержит много графических материалов, на которые я могу нажать.
Когда я нажимаю на определенный элемент, я хочу, чтобы моя форма ajax отправлялась (например, если я нажал кнопку).
Вот код js:
// circle is a Kinetic.Circle object.
circle.on("click touchcancel tap", function() {
var fill = onClick(posX, posY);
this.setFill(fill);
layer.draw();
});
function onClick(x, y) {
// Some stuff
jQuery("#mymoduleAjaxButton").trigger("mousedown");
return "red";
}
Как видите, я следую советам Амара (см. Первую строку), но я не работаю. Цвет моего круга меняется, но форма не отправлена.
Другие решения, которые я пробовал:
jQuery("#mymoduleAjaxButton").trigger("click"); // Like mousedown
jQuery("#mymoduleAjaxForm").submit(); // It refreshes my page... Not what i want, otherwise i wouldn't use ajax
jQuery(document).ready(function() { jQuery("#mymoduleAjaxButton").trigger("click"); });
/* Replace the click by mousedown doesn't change anything too,
moreover i believe it's useless here to add this here... */
Кто-нибудь знает, как я могу это сделать или знаю, что я делаю неправильно? Благодарю.
3 ответа
У меня тоже были проблемы с этим, что сработало для меня:
$('#my-form').trigger('submit');
Таким образом, вместо запуска события нажатия кнопки вы запускаете событие отправки формы.
Я читал, что вы больше не работаете над этим, но я решил поделиться с теми, кто сталкивался с этой темой во время поиска той же проблемы.
Вместо вызова отправки (которая перезагрузит всю страницу), запустите действие щелчка на кнопке отправки.
Обратите внимание, что из-за AJAX идентификаторы элементов формы заменяются. Поэтому мне пришлось использовать data-drupal-selector в моем jQuery, чтобы JavaScript работал несколько раз. Смотрите мой код ниже:
Drupal.behaviors.myCustomModule = {
attach: function (context, settings) {
$('select[data-drupal-selector="edit-YOUR-FIELD"]', context).change(function(){
$('#views-exposed-form-YOUR-VIEW-block-1 input.form-submit').trigger('click');
});
}
};
Пример для выставленных фильтров d8:
/*
* @file
*
*
* */
(function ($, Drupal, drupalSettings) { // closure
'use strict';
Drupal.behaviors.videos = {
attach: function (context) {
$('main', context).ready(init);
function init() {
SelectToUlFilter();
$('ul').on('click', '.selectlist-option', function () {
//stockage du filtre selectionné
var selected_filter = $(this).attr('data-value');
localStorage.setItem('data-value', selected_filter);
var $selectlist = $(this).closest('.selectlist');
$selectlist.find('.selectlist-option').removeClass('active');
$(this).addClass('active');
$($selectlist.data('select')).val($(this).data('value'));
$('.views-exposed-form input.form-submit').trigger('click');
SelectToUlFilter();
})
}
/**
* convertit select/option to ul/li
* affranchit de l'usage du submit bouton
* memoire des clicks
*/
function SelectToUlFilter() {
$(".views-exposed-form .form-select").once().each(function () {
$(this).hide();
$(".views-exposed-form").find("input[type='submit']").addClass("visually-hidden");
var $ul = $("<ul/>", {
'class': 'selectlist'
});
$ul.data('select', $(this));
$(this).find('option').each(function () {
var $li = $("<li/>", {
'class': 'selectlist-option',
'data-value': $(this).val(),
'text': $(this).text(),
'selected': 'selected'
});
$ul.append($li);
});
$(this).after($ul);
//affichage du filtre selectionné
if (localStorage.getItem("data-value") === null) {
localStorage.setItem('data-value', 'All');
}
var selected_filter = localStorage.getItem('data-value');
$("li[data-value=" + selected_filter + "]").attr('selected', "selected");
});
}
}
};
}(jQuery, Drupal, drupalSettings));