Sự kiện được kích hoạt sau khi tự động hoàn tất chạy và cách truy xuất giá trị đã chọn


8

Tôi có một hình thức thêm nút với một tham chiếu thuật ngữ sử dụng tiện ích tự động hoàn thành.

Tôi muốn "tid" của thuật ngữ được điền bởi người dùng bằng cách sử dụng tiện ích tự động hoàn thành.

Câu trả lời:


13

Không có sự kiện nào được kích hoạt tại thời điểm này (kể từ 7.34), nhưng có một bản vá về vấn đề này sẽ cho phép bạn sử dụng một cái gì đó như:

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

});

hoặc nếu bạn đang sử dụng trên phiên bản cũ của jQuery

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

});

Đâu nodelà mục được chọn. Bạn sẽ có thể lấy tidtừ một trong các thuộc tính trên đối tượng đó.


Cảm ơn bạn đã phản hồi Tôi cũng tìm thấy một giải pháp khác được mô tả trên bài đăng trên blog này: brockboland.com/drupaldork/2013/01/ mẹo
sel_space

@Clive: Đây có phải là công việc tìm kiếm tự động hoàn thành api không? Tôi có một truy vấn ở đây drupal.stackexchange.com/questions/286399/ phỏng
Suraj

3

Drupal 7 và 8 cung cấp việc tạo sự kiện tự động hoàn thành jQuery mà không cần bất kỳ mã tùy chỉnh nào tại thời điểm này.

Trong Drupal 7, autocompleteSelectsự kiện đã được thêm vào trong vấn đề Drupal # 365241 . (Clive đã đề cập đến vấn đề này khi anh ấy đăng phản hồi của mình.)

Drupal 8 sử dụng tiện ích tự động hoàn thành giao diện người dùng jQuery . Sự autocompleteclosekiện này là sự kiện UI UI tương tự như autocompleteSelectsự kiện D7 . Trong D8, autocompleteselectsự kiện UI UI cũng sẽ được kích hoạt nhưng một cuộc gọi lại Ajax trên nó sẽ không nhận được các giá trị trạng thái biểu mẫu được cập nhật. autocompleteclosecuộc gọi lại được cung cấp với các giá trị trạng thái biểu mẫu cập nhật, thường là những gì bạn muốn.

Như các câu trả lời khác đã chỉ ra, bạn có thể sử dụng dữ liệu sự kiện trong trình duyệt máy khách bằng cách sử dụng jQuery trên trình xử lý sự kiện hoặc Drupal.behaviors ( Drupal 7 , Drupal 8 ). Trong Drupal 7, bạn sẽ sử dụng autocompleteSelectsự kiện này và trên Drupal 8 autocompleteclose.

Nếu bạn cần giá trị trong mã PHP của mình, một cuộc gọi lại Ajax có thể được sử dụng. Dưới đây là một số hướng dẫn về cách thực hiện việc này trong Drupal 7 hoặc trong Drupal 8 .


1

Tôi cần sử dụng một hành vi để khiến nó hoạt động (nhờ vào vấn đề được Clive đề cập và nhận xét này: 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

Trong Drupal 8 điều này đã di chuyển. Bạn có thể ghi đè chức năng với mã sau đây.

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

Ghi đè mã trong core/misc/autocomplete.js.

Sau đó, trong mã của bạn, bạn có thể nghe

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

Sử dụng ghi đè của hình thức này không phải là một thực hành tốt nhất. Nếu hai phần ghi đè như vậy được đặt trong một trang web có tên sự kiện hơi khác nhau, ví dụ: 'autocomplete-select' và 'autocompleteSelect', thì cái được gán cuối cùng sẽ được ưu tiên và sự kiện đầu tiên sẽ không bao giờ được kích hoạt. Bên cạnh đó, cả Drupal 7 và 8 đều kích hoạt các sự kiện phù hợp mà không cần thêm mã. Xem câu trả lời của tôi drupal.stackexchange.com/a/228150/2272 .
keithm

Drupal.autocomplete.options.select = function selectHandler (event, ui) {Không thành công, khi không có trường tự động hoàn thành có sẵn trên trang cụ thể. Bạn phải thực hiện kiểm tra, để đảm bảo rằng trường tự động hoàn thành tồn tại. Nếu không, bạn sẽ phanh JS của bạn. Sau đó, bạn sẽ nhận được các lỗi như vậy:> Uncaught TypeError: Không thể đọc thuộc tính 'tùy chọn' không xác định tại node-form.js: 94 tại node-form.js: 113
jepster
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.