我有一个带有textfield元素的表单,当用户开始输入时,我希望预先填充不同的元素。
我一直在使用#ahah属性,该属性设置为'keyup'的事件属性正常但是我失去了对textfield元素的关注,因为'keyup'事件被触发的那一刻整个表单由于ahah的重建而被重建行为。
我尝试将事件属性设置为“更改”并且效果很好然而为了让“更改”事件触发我需要点击文本字段 - 所以从UI的角度来看我不能指望用户点击来自现场只是为了显示结果。
我不确定是否有可能用AHAH达到我想要的效果,但如果可能的话,我想坚持下去。
如果需要,很高兴提供代码,如果不清楚则很抱歉,很难解释。
由于 史蒂夫
答案 0 :(得分: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元素不应失去焦点,也不应以任何方式重新呈现,除非有其他原因导致某些错误。