Drupal ajax呼び出しが完了したときにJavaScript関数をトリガーするにはどうすればよいですか?


7

Drupal ajaxが何かをDOMに挿入した後で、追加の処理を行う必要があります。jQueryを使用すると、これは頭の痛いほど単純でしたが、私がDrupal 7でそれを行う方法を理解することはできません。

私のajax化されたリンクに何かを追加しますか?ビヘイビアのアタッチについて何か読みました...混乱が生じています...


3
1. AJAX呼び出しをトリガーしているものは何ですか?2.行動は正しいアプローチです。3.彼らはそれほど難しいことではありません;)
アマチュアバリスタ2012年

回答:


6

次のように、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);

1
アマチュアのバリスタが提案したようなDrupal.Behaviorsを見たことがありますか?
marcvangend 2012年

たとえば、IDが「block」の非表示フィールドを更新する場合は、次のコマンドを
shasi kanth

3

私のプロジェクトでは、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')は互換性があります。私はあなたが非常に創造的になり、より具体的で深いレベルの要素にバインド/トリガーできると思います。トップレベルのイベントトリガーよりも意味のあるシナリオを考えられる場合は、コメントしてください!


ありがとう!また、この回答の「MY_EVENT」の横に2番目の引数を追加して、JSコードのイベントによって実行される関数に渡すことができます。複数の引数またはオブジェクトを渡すには、json_encodeを使用できます。JSイベントは2つの引数を受け取る必要があります。最初の引数はイベント自体で、2番目の引数はJSON_ENCODEDです。 PHP: ajax_command_invoke( 'html'、 'trigger'、['agregar_qtip'、json_encode(['#edit-linea-0-id-producto'、 'No existe'])]) JS: $(document).bind( 'MY_EVENT'、関数(イベント、引数){}); お役に立てば幸いです。
Beto Aveiga、2015年

2

私は最良のオプションは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で私にとってはうまくいきました。


1

コードサンプル:

$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);

0

クイックハックソリューション:ロードされたコンテンツ内に画像を配置し、onload="[javascript function]()"属性を指定します。これが実際にあなたが探しているものかわからない...または、これが正しい方法よりも簡単な場合...しかし、何もしないよりはましでしょうか?


0

私はこの質問への回答を投稿しました

https://stackoverflow.com/a/19404566/894487

私は、拡張現実の間の違いのわかりませんDrupal.ajax.prototype.commands$.fn

前者の方が、関数にアクセスするために必要なdomトラバーサルが不要なので、より効率的だと思います。それが重要かどうかはわかりません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.