2016-11-13 93 views
0

我想添加一個ajax回調,以便在文本輸入字段發生更改時觸發,但無法弄清楚如何執行此操作。我曾嘗試添加在form_alter鉤的AJAX事件現場(這對於一個選擇字段運作良好),但它不是射擊:drupal 7如何在文本字段更改時觸發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']; 
} 

我也嘗試了keypress keyup事件,但無法獲得回調。

+0

你確定它不工作? AFAIK更改事件僅在文本字段丟失焦點時觸發。嘗試輸入或鍵入事件。 – 2pha

回答

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回調中的單選按鈕。
  • 可以替換頁面上的任何HTML,而不僅僅是一個表單元素。這只是提供包裝ID的問題。
  • 如果最簡單,您可以輕鬆替換整個表單。只需在整個表單數組中添加#prefix和#suffix,然後將其設置爲#ajax ['wrapper']。 (這將允許您通過單個ajax調用更改多個表單元素。)不這樣做的唯一原因是如果傳輸的信息較少,則該過程會更快。
  • 請記住,您在回調函數中處理的$表單已經通過所有表單處理函數發送(但尚未發送到drupal_render())。因此,在調整某個元素的標記時很簡單:

    $ elements ['some_element'] ['#markup'] ='新的標記。

    return $ elements;

  • 更改已被轉換爲#attributes 屬性的值意味着深入挖掘$ form數組,並且還會更改該元素的相應屬性。

    //你需要做兩件事

    $元素[ 'some_element'] [ '#禁用'] = TRUE;

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

    return $ elements;

+0

感謝您的完整分解。很多有用的信息,但在這種情況下,我正嘗試在表單構建器函數中創建不在回調中的回調。或者我錯過了什麼? – Finglish

+0

也許嘗試另一種事件類型?更改類型對於選擇或複選框效率更高,請嘗試使用另一種方法處理文本框,如鍵入? – Fky

相關問題