0

ユーザーが入力を開始したときに別の要素を事前入力したいテキストフィールド要素を持つフォームがあります。

'keyup'に設定されたイベントプロパティで正常に機能する#ahah属性を使用していますが、' keyup'イベントが発生した瞬間に、ahahの動作によりフォーム全体が再構築されるため、textfield要素に焦点が当てられなくなります。

イベントプロパティを「change」に設定しようとしましたが、これはうまく機能しますが、「change」イベントを発生させるには、テキストフィールドから離れてクリックする必要があります。したがって、UIの観点からは、ユーザーがフィールドから離れてクリックすることは期待できません。結果を表示します。

AHAHで自分のやりたいことがうまくいくかどうかはわかりませんが、できればそれを守りたいと思います。

必要に応じてコードを提供してください。明確でなく、説明が非常に難しい場合は申し訳ありません。

ありがとうスティーブ

4

1 に答える 1

3

フォーム全体をブラウザで再レンダリングしないでください。それはまさに、フォームの一部だけを更新できるという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要素は、バグの原因となる何かがない限り、フォーカスを失ったり、何らかの方法で再レンダリングしたりしないでください。

于 2012-06-21T22:15:47.673 に答える