Otomatik tamamlama çalıştıktan sonra tetiklenen olay nedir ve seçilen değerin nasıl alınacağı


8

Otomatik tamamlama widget'ı kullanan bir terim başvurusu ile bir düğüm ekleme formu var.

Otomatik tamamlama widget'ı kullanarak kullanıcı tarafından doldurulmuş terimin "tid" istiyorum.

Yanıtlar:


13

Şu anda hiçbir olay tetiklenmiyor (7.34 itibariyle), ancak bu konuda aşağıdaki gibi bir şey kullanmanıza izin veren bir yama var :

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

});

veya jQuery'nin eski sürümünü kullanıyorsanız

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

});

nodeSeçilen öğe nerede . Bu tidnesnenin özelliklerinden birini alabilmeniz gerekir .


Yanıtınız için teşekkür ederim Ayrıca bu blog yazısında açıklanan başka bir çözüm buldum: brockboland.com/drupaldork/2013/01/…
sel_space

@Clive: Bu arama api otomatik tamamlama için mi? Burada bir sorgu var mı drupal.stackexchange.com/questions/286399/…
Suraj

3

Drupal 7 ve 8, şu anda herhangi bir özel kod olmadan jQuery otomatik tamamlama olay oluşturma olanağı sağlar.

Drupal 7'de, autocompleteSelectolay 365241 numaralı Drupal sayısında eklendi . (Clive, yanıtını gönderdiğinde bunun devam ettiğini belirtti.)

Drupal 8, jQuery UI otomatik tamamlama widget'ını kullanır . autocompletecloseOlay D7 en çok benzeyen jQuery UI olaydır autocompleteSelectolay. D8'de jQuery UI autocompleteselectolayı da tetiklenir, ancak üzerindeki Ajax geri çağırma güncellenmiş form durumu değerlerini almaz. autocompletecloseGeri aramalar genellikle istediğiniz gibi güncellenmiş form durumu değerleri ile sağlanır.

Diğer yanıtların belirttiği gibi, olay işleyicisindeki bir jQuery veya Drupal.behaviors ( Drupal 7 , Drupal 8 ) kullanarak istemci tarayıcısındaki olay verilerini kullanabilirsiniz . Drupal 7'de autocompleteSelectetkinliği ve Drupal 8'de kullanırsınız autocompleteclose.

PHP kodunuzdaki değere ihtiyacınız varsa, bir Ajax geri çağrısı kullanılabilir. Drupal 7 veya Drupal 8'de bunun nasıl yapılacağı ile ilgili bazı talimatlar .


1

Çalışması için bir davranış kullanmam gerekiyordu (Clive tarafından bahsedilen sorun sayesinde ve bu yorum: 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'de bu hareket etti. Aşağıdaki kodla işlevselliği geçersiz kılabilirsiniz.

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

İçindeki kodu geçersiz kılar core/misc/autocomplete.js.

Sonra kodunuzda dinleyebilirsiniz

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');
    }
  })

Bu formun geçersiz kılınması en iyi uygulama değildir. Bu tür iki geçersiz kılma, biraz farklı olay adlarına sahip bir siteye yerleştirilirse, örneğin, 'otomatik tamamla-seç' ve 'otomatik tamamlaSeç', ilk atanmış olan önceliğe sahip olur ve ilk olay hiçbir zaman tetiklenmez. Ayrıca, Drupal 7 ve 8'in her ikisi de ek kod olmadan uygun olayları tetikler. Cevabım drupal.stackexchange.com/a/228150/2272 adresine bakın .
keithm

Drupal.autocomplete.options.select = function selectHandler (event, ui) {Belirli bir sayfada otomatik tamamlama alanı yoksa başarısız olur. Otomatik tamamlama alanının var olduğundan emin olmak için bir kontrol uygulamalısınız. Aksi takdirde JS'nizi frenleyeceksiniz. Bu tür hataları alırsınız:> Yakalanmamış TypeError: node-form.js: 94 adresinde node-form.js: 94 adresinde undefined özelliği 'seçenekleri' okunamıyor: 113
jepster
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.