web-dev-qa-db-ja.com

ajaxイベント後にJavascriptをリロードする

ボタンを使用するたびに、ボタンを使用して埋め込みビューをロードするモジュールがあります。

// function to print builder view
    function workout_builder_template() {
        $viewName = 'builder_view';
        print views_embed_view($viewName);
    }

workout_builder_template();

ただし、ボタンが押された後、新しいビューがロードされ、ビューはもはやajax化されません。たとえば、公開されたフォームを変更した後で適用ボタンをクリックすると、フォームは新しいページに送信されます。 ajaxを介して埋め込みビューをロードするボタンをクリックする前に、公開されたフォームがajaxを介してビューのコンテンツを変更しました。

これは、ajaxifiedビューからのhtmlの例です

<form accept-charset="UTF-8" id="views-exposed-form-builder-view-default" method="get" action="/drupal7/builder-view" class="ctools-auto-submit-full-form ctools-auto-submit-processed jquery-once-1-processed">

これはajaxレスビューからのhtmlの例です

  <form accept-charset="UTF-8" id="views-exposed-form-builder-view-default" method="get" action="/drupal7/builder-view" class="ctools-auto-submit-full-form">

この例では、ajaxなしビューに処理済みクラスが追加されていません。これから、最初のajaxイベントの後で、新しいビューにJavaScriptがアタッチされていないのではないかと思います。私はdrupal.behaviorsを研究していて、印刷について考えていました

$vars['scripts'] = drupal_get_js();
print $vars['scripts'];

上に表示されたworkout_builder_template()関数内ですが、これがどのように行われるかわかりません

1
Andrae Browne

私はここで間違っている可能性がありますが、埋め込みビューのフェッチとクライアント側でのHTML更新がカスタムJavascriptコードを使用して行われたと想定します。

新しいHTMLがカスタムの方法でDOMに追加されたら、XHRクライアントのsuccessコールバック内から、アクティブモジュールによって定義されたすべてのDrupal動作をアタッチします(たとえばjQuery.ajax())手動で呼び出す必要がある場合があります。

_// $wrapper here is the jQuery object identifying the wrapper element to
// which your new HTML has been injected to. Eg. $wrapper = $('.my-view-wrapper')
Drupal.attachBehaviors($wrapper, Drupal.settings);
_

私が推奨するのは、Drupal AJAX API( Documentation ))を使用して、これを維持できるようにすることですrefreshサーバー側のロジック(1か所)。もう1つの明らかな利点は、Drupal.attachBehaviors()が自動的に呼び出されることです。

2