DrupalのAjaxオブジェクトを直接いじっているので、これが最善の方法だとは思いません。
これを行う最良の方法は、基本的に独自のクリックハンドラーを記述し、確認を自分で処理してから、Drupal AJAX呼び出しを自分でトリガーすることです。
次に例を示します。
l(t('Click here'), 'mypath', array('attributes' => array('id' => 'my-id', 'class' => array('toms-ajax'))));
あなたのjsファイルで:
(function($) {
Drupal.behaviors.tomsAjaxLinks = {
attach: function(context, settings) {
$('.toms-ajax',context).once('toms-ajax').on('click', this.handleAjax);
},
handleAjax: function(e) {
// Cache the anchor link
var $element = $(this);
// We need some unique id, either ID of link or create our own
var nowStamp = new Date().getTime() + Math.floor(Math.random() * (1000 - 0) + 0);
var base = $element.attr('id') || 'toms-ajax-'+ nowStamp;
// Change the event type to load, so we can trigger it ourselves
var drupal_ajax_settings = {
url : $element.attr('href'),
event : 'load',
progress : {
type: 'throbber',
message : '',
}
};
// Create the ajax object
Drupal.ajax[base] = new Drupal.ajax(base, this, drupal_ajax_settings);
// Your confirmation code e.g. Jquery UI Dialog or something
// Open dialog
if(yes) {
$element.trigger('load');
} else {
// Dont trigger ajax
}
}
};
})(jQuery);
基本的に、これは次のことを行います。
- 複数のイベントハンドラーをアタッチしないように、handleAjax関数を「.toms-ajax」リンクに1回アタッチします。
- クリックすると、handleAjax関数が呼び出されます
- 対応するDrupal Ajaxオブジェクトは、独自の一意のIDで作成されます。これはリンクに添付され、イベント「load」でトリガーされます。次に、確認ボックスを処理します。
- 確認ボックスでajaxcallを確認すると、リンクオブジェクトで「load」イベントをトリガーするだけなので、Drupal AJAXオブジェクトでそれを実行します。
options.beforeSerialize
か?ドキュメントはかなり悪く、これら3つのうちどれが正しい方法かはわかりませんが、両方をテストするのに5分もかかりません。options.beforeSubmit
beforeSerialize