自动完成运行后触发的事件是什么,以及如何检索选择的值


8

我有一个带有使用自动完成小部件的术语引用的节点添加表单。

我希望用户使用自动完成小部件来填充术语的“ tid”。

Answers:


13

目前(从7.34版开始)没有任何事件被触发,但是此问题上有一个补丁程序可以让您使用类似以下的内容:

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

});

或者如果您使用的是旧版jQuery

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

});

node所选项目在哪里。您应该能够tid从该对象的属性之一获取。


谢谢你的回应,我也发现这个博客帖子描述的另一种解决方案:brockboland.com/drupaldork/2013/01/...
sel_space

@Clive:这项工作可用于搜索api自动完成吗?我在这里有一个查询drupal.stackexchange.com/questions/286399/…–
Suraj

3

Drupal 7和8目前提供了jQuery自动完成事件生成功能,而无需任何自定义代码。

在Drupal 7中,该autocompleteSelect事件已添加到Drupal问题#365241中。(克莱夫(Clive)在发表回应时说,这正在进行中。)

Drupal 8使用jQuery UI 自动完成小部件。该autocompleteclose事件是最类似于D7 autocompleteSelect事件的jQuery UI 事件。在D8中,jQuery UI autocompleteselect事件也将被触发,但是其上的Ajax回调将不会接收更新的表单状态值。autocompleteclose回调具有更新的表单状态值,通常是您想要的。

如其他答案所示,您可以使用事件处理程序jQuery或Drupal.behaviors(Drupal 7Drupal 8)在客户端浏览器中使用事件数据。在Drupal 7中,您将使用该autocompleteSelect事件;在Drupal 8中,您将使用该事件autocompleteclose

如果您需要PHP代码中的值,则可以使用Ajax回调。这是在Drupal 7Drupal 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”,则最后分配的优先级将优先,而第一个事件将永远不会触发。此外,Drupal 7和8都触发了适当的事件,而没有任何其他代码。请参阅我的答案drupal.stackexchange.com/a/228150/2272
基思姆

Drupal.autocomplete.options.select = function selectHandler(event,ui){在特定页面上没有自动完成字段时,会失败。您必须实施检查,以确保自动完成字段存在。否则,您将停止JS。然后,您将得到这样的错误:>未被捕获的TypeError:无法在node-form.js:113处的node-form.js:94处读取undefined的属性“选项”
jepster
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.