フォーム全体をブラウザで再レンダリングしないでください。それはまさに、フォームの一部だけを更新できるというAHAHのアイデアです。DrupalのJS機能を非同期で更新するDOM要素のID(HTML属性など)に(#ahah属性の)「wrapper」属性を設定してください。
例えば:
<?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要素は、バグの原因となる何かがない限り、フォーカスを失ったり、何らかの方法で再レンダリングしたりしないでください。