【问题标题】:drupal 7 how to fire ajax callback when text field changesdrupal 7如何在文本字段更改时触发ajax回调
【发布时间】:2016-11-13 22:14:43
【问题描述】:

我正在尝试添加一个 ajax 回调,以便在更改文本输入字段时触发,但不知道该怎么做。我尝试在 form_alter 钩子中的字段中添加一个 ajax 事件(这对于选择字段效果很好),但它没有触发:

my_form_alter(&$form, &$form_state) {
    form['my_text_field'][LANGUAGE_NONE]['#ajax'] = array(
        'callback' => 'my_text_field_callback',
        'wrapper' => 'my-field-wrapper',
        'method' => 'replace',
        'event' => 'change'
   );
}

回调非常简单:

function my_text_field_callback($form, &$form_state) {
    return $form['my_text_field'];
}

我也尝试过 keypress keyup 事件,但无法触发回调。

【问题讨论】:

  • 您确定它不起作用吗? AFAIK 更改事件仅在文本字段失去焦点时触发。尝试输入或按键事件。

标签: ajax drupal drupal-7 drupal-forms


【解决方案1】:

也许这个链接可以帮助你:https://www.drupal.org/docs/7/api/javascript-api/ajax-forms-in-drupal-7

  • 只能在表单构建器函数中更改表单(此处示例中为 ajax_example_autocheckboxes()),否则验证将失败。回调函数不得改变表单或任何其他状态。
  • 关于 Ajax 回调和 #default_value:当 Ajax 替换页面上的表单元素时,表单字段值不会自动填充为 #default_value。但是,在使用 Ajax 回调时,还有其他方法可以设置默认值。有关进一步的讨论/提示和示例代码,请参阅这些链接:Form API:默认值不会更改并且 Default_value 不适用于 Ajax 回调中的单选按钮。
  • 可以替换页面上的任何 HTML,而不仅仅是表单元素。这只是提供包装器 ID 的问题。
  • 如果最简单的话,您可以轻松地替换整个表单。只需将#prefix 和#suffix 添加到整个表单数组,然后将其设置为#ajax['wrapper']。 (这将允许您通过单个 ajax 调用来更改多个表单元素。)不这样做的唯一原因是,如果传输的信息较少,则该过程会更快。
  • 请记住,您在回调函数中处理的 $form 已经通过所有表单处理函数发送(但尚未发送到 drupal_render())。因此,在调整元素的标记时,例如:

    $elements['some_element']['#markup'] = '新标记。';

    返回$元素;

  • 更改已转换为 #attributes 的值 属性意味着更深入地挖掘 $form 数组,以及 更改该元素的相应属性。

    // 两者都需要

    $elements['some_element']['#disabled'] = TRUE;

    $elements['some_element']['#attributes']['disabled'] = 'disabled';

    返回$元素;

【讨论】:

  • 感谢您提供如此完整的细分。很多有用的信息,但在这种情况下,我试图在表单构建器函数中创建回调,而不是在回调中。还是我错过了什么?
  • 也许尝试其他事件类型?使用选择或复选框更改类型更有效,尝试另一种文本字段,如 keyup ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
相关资源
最近更新 更多