回答:
次のように、ajaxハンドラーによって返されているページにいくつかの追加コマンドを追加してしまいました。
$commands = array();
$commands[] = ajax_command_invoke(NULL, 'grid_content_loading', array('argument1', 'argument2'));
$commands[] = ajax_command_append('#grid-content-target', $html);
$commands[] = ajax_command_invoke(NULL, 'grid_content_loaded', array('argument1', 'argument2'));
$page = array('#type' => 'ajax', '#commands' => $commands);
ajax_deliver($page);
クライアント側では、jQueryを介して2つのJavaScript関数を作成しました。
(function($) {
$.fn.grid_content_loading = function($argument1, $argument2) {
...
};
$.fn.grid_content_loaded = function($argument1, $argument2) {
...
};
})(jQuery);
私のプロジェクトでは、AJAX呼び出しの後にページの統計を更新する明確に定義されたJavaScriptコードを既に記述していました。
「jQueryを拡張する」ことをせずに関数を再利用したかったので、新しい関数を定義する代わりに、既存のjQuery関数を使用して、次の解決策になりました。これは、「フラグ」モジュールが行うことに触発されました-ソリューションのように単一のハードコードされたカスタムのjQueryプラグイン/拡張を使用するのではなく、単にイベントをトリガーし、多くのJavaScriptイベントリスナーが応答して動作できるようにします以前の回答で探った。
Drupalモジュールで:
// in_some_ajax_function()
$commands[] = ajax_command_invoke('html', 'trigger', array('MY_EVENT'));
Javascriptの場合:
// Added an event binding to my $(document).ready();
$(document).ready(function(){
$(document).bind('MY_EVENT', function() {
alert('MY_EVENT');
});
});
ajax_command_invokeの最初のパラメーターは決してネイティブJavaScriptオブジェクトではないことに注意してください。そのため、次のコードは「ドキュメント」(要素)セレクターに変換されるため、機能しません。
// This tries to select $('document')
// ... which is nothing, since there are no 'document' elements.
$commands[] = ajax_command_invoke('document', 'trigger', array('MY_EVENT'));
奇妙なことに、バインドオン$(document)
とトリガーオン$('html')
は互換性があります。私はあなたが非常に創造的になり、より具体的で深いレベルの要素にバインド/トリガーできると思います。トップレベルのイベントトリガーよりも意味のあるシナリオを考えられる場合は、コメントしてください!
私は最良のオプションはjQuery ajaxComplete
関数を使用することだと思います:
(function($){
$(document).ajaxComplete(function(e, xhr, settings)
{
alert(settings.url);
});
}(jQuery));
また、特定のajax関数に関数を使用する場合は、フィールドに指定されたsettings.urlを使用して、次のように変更できます。
(function($) {
$(document).ajaxComplete(function(e, xhr, settings){
if (settings.url == "the path from step 1") {
// Code to populate your fields here
}
});
}(jQuery));
これは、Drupal 7および8で私にとってはうまくいきました。
コードサンプル:
$commands = array();
$commands[] = array(
'command' => 'your_js_callback', // the name of your javascript callback
'value1' => 'My first value',
'value2' => 'My second value',
);
ajax_render($commands);
JSコード:
(function($, Drupal) {
Drupal.ajax.prototype.commands.your_js_callback = function(ajax, response, status) {
alert(response.value1);
alert(response.value2);
}
})(jQuery, Drupal);
私はこの質問への回答を投稿しました
https://stackoverflow.com/a/19404566/894487
私は、拡張現実の間の違いのわかりませんDrupal.ajax.prototype.commands
か $.fn
前者の方が、関数にアクセスするために必要なdomトラバーサルが不要なので、より効率的だと思います。それが重要かどうかはわかりません。
Drupal 7でこれを行う方法についてのチュートリアルを書きました:https : //www.jaypan.com/tutorial/calling-function-after-ajax-event-drupal-7