私は選択フォーム入力を持つ単純なajaxフォームを持っています:
_$form['children']['number_children'] = array(
'#title' => t('Počet detí'),
'#type' => 'select',
'#options' => range(0, 15),
'#default_value' => $number_children,
'#ajax' => array(
'callback' => 'ajax_callback_registration_children',
'wrapper' => 'children-div',
'method' => 'replace',
'effect' => 'fade',
),
);
_
選択入力が手動で変更されると、ajaxが適切に実行され、新しい入力がフォームに追加されます。しかし、選択したオプションを変更しているjavasrciptコードによってajaxコールバックをトリガーする必要があります。
_$('#children-div select[name="number_children"]').val('3').change();
_
これにより値が変更されますが、ajaxはまったくトリガーされません。なぜうまくいかず、私にできることがあるのですか?
[〜#〜] edit [〜#〜]:これは、コマンド$('#children-div select[name="number_children"]').val('3').change();
またはイベントをトリガーする別の方法がブラウザーコンソールに入力されたときに機能しますが、同じ場合は機能しませんコードはmy chrome extensionから実行されます。Drupalが何がイベントを正確にトリガーしたかを何らかの方法で検証することは可能ですか?
DrupalでAjax送信を実行するためにフォームボタンのクリックをトリガーしようとすると、同様の問題が発生しました。その後、明示的に.mousedown()
である必要があることがわかりました。他には何もありません。
参照のためにこの質問を参照してください: AJAX enabled form submit button? をクリックしてプログラムでクリックをトリガーする方法.
したがって、ここで十分ではないのは、.change()
を呼び出すことだけだと思います。他のすべての代替案を試してください。
ビューモジュールのviews-admin.jsファイルで、選択をオーバーライドするための.trigger('change')
を見つけました。多分それだけです。
次のようにイベントを指定してみてください
$form['children']['number_children'] = array(
'#title' => t('Počet detí'),
'#type' => 'select',
'#options' => range(0, 15),
'#default_value' => $number_children,
'#ajax' => array(
'callback' => 'ajax_callback_registration_children',
'wrapper' => 'children-div',
'method' => 'replace',
'effect' => 'fade',
'event' => 'change',
),
);
これで十分なはずです(ただし、selectはデフォルトのイベントとしてすでに変更を使用しています..)
他に試してみることができます
次のようなカスタムイベントを追加します。
'event' => 'custom_change',
jQuery('select').trigger('custom_change');
または、自分でコールバックを呼び出します。
Drupal.ajax['#ID'].eventResponse('#ID');
このコードを試してください
Ajaxコールバック関数:
/**
* Ajax Callback
*
* @param type $form
* @param type $form_state
* @return type
*/
function ajax_callback_registration_children(&$form, $form_state) {
$commands = [];
$commands[] = ajax_command_html('#children-div');
// Call js.
$commands[] = ['command' => 'afterAjaxCallbackExample',
'selectedValue' => $form_state['values']['number_children'],
];
return array('#type' => 'ajax', '#commands' => $commands);
}
js:
(function($, Drupal){
// Our function name is prototyped as part of the Drupal.ajax namespace, adding to the commands:
Drupal.ajax.prototype.commands.afterAjaxCallbackExample = function(ajax, response, status)
{
// your code here..
};
}(jQuery、Drupal));