0

我有一个带有文本字段元素的表单,当用户开始输入时,我想预先填充不同的元素。

我一直在使用 #ahah 属性,该属性在将事件属性设置为“keyup”时效果很好,但是我失去了对 textfield 元素的关注,因为在触发“keyup”事件的那一刻,由于 ahah 的行为,整个表单被重建。

我尝试将事件属性设置为“更改”,并且效果很好但是为了触发“更改”事件,我需要从文本字段中单击 - 所以从 UI 的角度来看,我不能指望用户点击离开字段以显示结果。

我不确定是否可以通过 AHAH 实现我想要的,这很好,但如果可能的话,我想坚持下去。

如果需要,很乐意提供代码,如果不清楚,很抱歉,很难解释。

谢谢史蒂夫

4

1 回答 1

3

浏览器不应重新呈现整个表单。这正是 AHAH 的想法,您可以只更新表单的一部分。确保将“包装器”属性(#ahah 属性)设置为您希望 Drupal 的 JS 功能异步更新的 DOM 元素的 ID(如:HTML 属性)。

例如:

<?php
function MYMODULE_some_ahah_enabled_form(&$form_state) {

  $initial_markup = '<div>' . t('This content will be replaced') . '</div>';

  $form['dynamic_thing'] = array(
    '#type' => 'markup',
    '#prefix' => '<div id="dynamic-thing">', // Set Drupal's AHAH wrapper to this ID
    '#suffix' => '</div>',
    '#value' => $initial_markup,
  );

  $form['field_which_will_trigger_ahah_behavior'] = array(
    '#type' => 'textfield',
    '#ahah' => array(
      'path' => 'MYMODULE/path/to/ahah/callback',
      'wrapper' => 'dynamic-thing',
      'event' => 'keyup',
    ),
    '#default_value' => 'Change me',
  );

  return $form;
}

/**
 * Your menu callback (which is declared in your hook_menu()) which returns only the HTML that will replace the existing markup in $form['dynamic_thing'].
 */
function MYMODULE_ahah_callback() {
  $output = '<div>New content for the dynamic thing</div>';
  drupal_json(array('status' => TRUE, 'data' => $output));
  exit();
}

浏览器中的“field_which_will_trigger_ahah_behavior”DOM 元素不应失去焦点,或以任何方式重新渲染,除非有其他原因导致某些错误。

于 2012-06-21T22:15:47.673 回答