Apa yang dipicu acara setelah pelengkapan otomatis berjalan dan cara mengambil nilai yang dipilih

8

Saya memiliki simpul menambahkan formulir dengan referensi istilah yang menggunakan widget autocomplete.

Saya ingin "tid" dari istilah yang diisi oleh pengguna menggunakan widget autocomplete.

sel_space
sumber

Jawaban:

13

Tidak ada peristiwa yang dipicu saat ini (pada 7.34), tetapi ada tambalan tentang masalah ini yang seharusnya memungkinkan Anda menggunakan sesuatu seperti:

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

});

atau jika Anda menggunakan jQuery versi lama

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

});

Di mana nodeitem yang dipilih. Anda harus bisa mendapatkan tiddari salah satu properti pada objek itu.

Clive
sumber
Terima kasih atas tanggapannya. Saya juga menemukan solusi lain yang diuraikan di posting blog ini: brockboland.com/drupaldork/2013/01/…
sel_space
@Clive: Apakah ini bekerja untuk pencarian api autocomplete? Saya punya pertanyaan di sini drupal.stackexchange.com/questions/286399/…
Suraj
3

Drupal 7 dan 8 menyediakan pembuatan acara autocomplete jQuery tanpa kode khusus saat ini.

Di Drupal 7, autocompleteSelectacara ditambahkan dalam masalah Drupal # 365241 . (Clive menyebutkan ini sedang berlangsung ketika dia memposting tanggapannya.)

Drupal 8 menggunakan widget autocomplete jQuery UI . The autocompletecloseevent adalah event jQuery UI yang paling mirip dengan D7 autocompleteSelectacara. Di D8 UI jQueryautocompleteselect juga akan dipicu tetapi panggilan balik Ajax tidak akan menerima nilai status formulir yang diperbarui. autocompleteclosepanggilan balik diberikan dengan nilai status formulir yang diperbarui, yang biasanya Anda inginkan.

Seperti jawaban lain telah ditunjukkan, Anda dapat menggunakan data acara di browser klien menggunakan jQuery on event handler, atau Drupal.behaviors ( Drupal 7 , Drupal 8 ). Di Drupal 7 Anda akan menggunakan autocompleteSelectacara tersebut, dan pada Drupal 8 autocompleteclose.

Jika Anda membutuhkan nilai dalam kode PHP Anda, panggilan balik Ajax dapat digunakan. Berikut adalah beberapa petunjuk tentang cara melakukan ini di Drupal 7 atau di Drupal 8 .

keithm
sumber
1

Saya perlu menggunakan perilaku untuk membuatnya berfungsi (berkat masalah yang disebutkan oleh Clive, dan komentar ini: 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, '');

      });
    }
  };
tyler.frankenstein
sumber
0

Di Drupal 8 ini telah pindah. Anda dapat mengganti fungsionalitas dengan kode berikut.

/**
 * 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;
}

Mengganti kode dalam core/misc/autocomplete.js .

Kemudian dalam kode Anda, Anda dapat mendengarkan

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');
    }
  })
Jason Yarrington
sumber
Menggunakan penggantian formulir ini bukan praktik terbaik. Jika dua penggantian seperti itu diletakkan di situs dengan nama acara yang sedikit berbeda, misalnya, 'pilih-otomatis-pilih' dan 'pilih otomatis-pilih', yang ditugaskan terakhir akan diutamakan dan acara pertama tidak akan pernah dipicu. Selain itu, Drupal 7 dan 8 keduanya memicu acara yang sesuai tanpa kode tambahan. Lihat jawaban saya drupal.stackexchange.com/a/228150/2272 .
keithm
Drupal.autocomplete.options.select = fungsi selectHandler (event, ui) {Gagal, ketika tidak ada bidang autocomplete yang tersedia di halaman tertentu. Anda harus menerapkan pemeriksaan, untuk memastikan bahwa bidang lengkapi-otomatis ada. Kalau tidak, Anda akan rem JS Anda. Anda akan mendapatkan kesalahan seperti itu:> UnEught TypeError: Tidak dapat membaca properti 'opsi' yang tidak terdefinisi di node-form.js: 94 at node-form.js: 113
jepster