オートコンプリートの実行後にトリガーされるイベントとは何ですか。また、選択した値を取得する方法


8

オートコンプリートウィジェットを使用する用語参照を持つノード追加フォームがあります。

オートコンプリートウィジェットを使用して、ユーザーが入力した用語の「tid」が欲しい。

回答:


13

現時点ではイベントはトリガーされません(7.34以降)が、この問題には次のようなものを使用できるようにするパッチがあります。

$('#input-id').on('autocompleteSelect', function(event, node) {

});

またはjQueryの古いバージョンで使用している場合

$('#input-id').bind('autocompleteSelect', function(event, node) {

});

node選択したアイテムはどこにありますか。tidそのオブジェクトのプロパティの1つからを取得できるはずです。


:私もこのブログの記事に記載されている別の解決策た応答をありがとうbrockboland.com/drupaldork/2013/01/...
sel_space

@Clive:この作品は、私はここにクエリが持っている検索APIの自動補完のためですか?drupal.stackexchange.com/questions/286399/...
スラジ

3

Drupal 7および8は、現時点ではカスタムコードなしでjQueryオートコンプリートイベントを生成します。

Drupal 7では、autocompleteSelectイベントはDrupalの問題#365241に追加されました。(クライヴはこれが進行中であると述べ、彼の返事を投稿した。)

Drupal 8はjQuery UI オートコンプリートウィジェットを使用します。このautocompletecloseイベントは、D7 autocompleteSelectイベントに最も類似したjQuery UI イベントです。D8ではjQuery UI autocompleteselectイベントもトリガーされますが、そのイベントのAjaxコールバックは更新されたフォームの状態値を受け取りません。autocompletecloseコールバックには、更新されたフォームの状態値が提供されます。これは通常必要な値です。

他の回答が示しているように、jQuery on eventハンドラーまたはDrupal.behaviors(Drupal 7Drupal 8)を使用して、クライアントブラウザーでイベントデータを利用できます。Drupal 7ではautocompleteSelectイベントを使用し、Drupal 8ではイベントを使用しますautocompleteclose

PHPコードに値が必要な場合は、Ajaxコールバックを使用できます。Drupal 7またはDrupal 8でこれを行う方法について、以下にいくつか説明します。


1

私はそれを動作させるために動作を使用する必要がありました(Cliveによって言及された問題とこのコメントのおかげで:https : //www.drupal.org/node/365241#comment-9575707):

Drupal.behaviors.autocompleteSupervisor = {
    attach: function (context) {
      $('#edit-field-foo-und-0-target-id', context).bind('autocompleteSelect', function(event, node) {

        // Do custom stuff here...
        var entity_id = $(this).val().replace($(node).text().trim(), '').replace(/\(|\)| /g, '');

      });
    }
  };

0

Drupal 8ではこれは移動しました。次のコードで機能をオーバーライドできます。

/**
 * Handles an autocompleteselect event.
 *
 * Override the autocomplete method to add a custom event.
 *
 * @param {jQuery.Event} event
 *   The event triggered.
 * @param {object} ui
 *   The jQuery UI settings object.
 *
 * @return {bool}
 *   Returns false to indicate the event status.
 */
Drupal.autocomplete.options.select = function selectHandler(event, ui) {
  var terms = Drupal.autocomplete.splitValues(event.target.value);
  // Remove the current input.
  terms.pop();
  // Add the selected item.
  if (ui.item.value.search(',') > 0) {
    terms.push('"' + ui.item.value + '"');
  }
  else {
    terms.push(ui.item.value);
  }
  event.target.value = terms.join(', ');
  // Fire custom event that other controllers can listen to.
  jQuery(event.target).trigger('autocomplete-select');
  // Return false to tell jQuery UI that we've filled in the value already.
  return false;
}

のコードをオーバーライドしますcore/misc/autocomplete.js

次に、コードで聞くことができます

var field = jQuery('<field-selector>');

var lastField = ''
field.on('autocomplete-select', function() {
    console.log("autocompleteSelect");
    // Check that field actually changed.
    if ($(this).val() != lastValue) {
      lastValue = $(this).val();
      console.log('The text box really changed this time');
    }
  })

このフォームのオーバーライドを使用することはベストプラクティスではありません。「autocomplete-select」と「autocompleteSelect」など、わずかに異なるイベント名でサイトにそのようなオーバーライドが2つ配置された場合、最後に割り当てられたものが優先され、最初のイベントはトリガーされません。さらに、Drupal 7と8はどちらも、追加のコードなしで適切なイベントをトリガーします。私の回答drupal.stackexchange.com/a/228150/2272を参照してください。
keithm 2017年

Drupal.autocomplete.options.select = function selectHandler(event、ui){特定のページでオートコンプリートフィールドを使用できない場合は失敗します。オートコンプリートフィールドが存在することを確認するには、チェックを実装する必要があります。それ以外の場合は、JSにブレーキをかけます。次に、そのようなエラーが発生します。> Uncaught TypeError:node-form.js:94 at node-form.js:113でundefinedのプロパティ 'options'を読み取れません
jepster
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.