drupal 7如何在文本字段更改时触发ajax回调

时间:2016-11-13 22:14:43

标签: ajax drupal drupal-7 drupal-forms

我正在尝试添加一个在更改文本输入字段时触发的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'];
}

我也尝试过按键加密事件,但无法触发回调。

1 个答案:

答案 0 :(得分: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回调时,还有其他方法可以设置默认值。有关进一步的讨论/提示和示例代码,请参阅以下链接:表单API:默认值不会更改,并且Default_value不适用于Ajax Callback中的单选按钮。
  • 可以替换页面上的任何HTML,而不仅仅是表单元素。这只是提供包装ID的问题。
  • 如果最简单,您可以轻松替换整个表单。只需将#prefix和#suffix添加到整个表单数组中,然后将其设置为#ajax ['wrapper']。 (这将允许您通过单个ajax调用更改多个表单元素。)不执行此操作的唯一原因是,如果传输的信息较少,则该过程会更快。
  • 请记住,您在回调函数中处理的$表单已经通过所有表单处理函数发送(但尚未发送到drupal_render())。因此,在调整时,例如,元素的标记很简单:

    $ elements ['some_element'] ['#markup'] ='新加价。';

    返回$ elements;

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

    //你需要同时做两件事

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

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

    返回$ elements;