为什么我的 autocomplete.js 文本字段没有响应输入 (Drupal 7)?
Why isn't my autocomplete.js textfield responding to input (Drupal 7)?
我正在尝试让自动完成功能用于我的 Drupal 安装中的文本字段。这是一个大项目,我还不熟悉 Drupal 和这个大代码库。请假设我可以犯最简单的错误。
好的,所以我一直在学习有关如何让我的文本字段自动完成的简单教程。
我有一个 hook_menu():
/**
* Implements hook_menu().
*/
function mod_name_menu() {
$items = array();
// Not important for this question. This is the submit URL.
$items['apps/name/result'] = array(
'title' => t('Result page'),
'file' => 'mod_name.pages.inc',
'file path' => drupal_get_path('module', 'mod_name'),
'page callback' => 'drupal_get_form',
'page arguments' => array('mod_name_course_display_form'),
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
// This is the relevant one!
$items['apps/name/course-codes'] = array(
'file' => 'mod_name.pages.inc',
'file path' => drupal_get_path('module', 'mod_name'),
'page callback' => 'mod_name_course_code_list',
'page arguments' => array('access content'),
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
return $items;
}
我有一个相当大的表单可以使用,但文本字段的相关部分如下:
(mod_name.pages.inc)
function mod_name_basic_block_form($form, &$form_state) {
[...]
$form['search']['course_code'] = array(
'#id' => 'course-code-textbox',
'#type' => 'textfield',
'#title' => t('Course code'),
'#default_value' => (isset($_POST['course_code']) ?
strtoupper($_POST['course_code']) :
(isset($_GET['course_code']) ?
$_GET['course_code'] :
'')),
'#required' => FALSE,
'#size' => '20',
'#autocomplete_path' => 'apps/name/course-codes',
);
[...]
return $form;
}
[...]
/**
* Autocomplete for the course-code form.
*/
function mod_name_course_code_list($text) {
$results = array('1' => 'Thing 1', '2' => 'Thing 2');
drupal_json_output($results);
}
[...]
我暂时将回调函数保留为静态数组,以查看自动完成的行为方式。我希望当我在文本字段中键入内容时,throbber 应该会跳动,然后我会看到自动完成 "Thing 1"、"Thing 2" 或类似内容。但是,当我在文本字段中键入时,什么也没有发生。我确实在页面加载时看到一个灰色的跳动,但它在键入、模糊或单击时没有动画。
检查页面时,我发现 autocomplete.js 已加载到“网络”选项卡中。我还看到输入字段具有自动完成属性。我在 Firefox 和 Chrome 中都试过了,但都没有产生任何动作。
我正在使用Drupal 7.32
如果能提供任何帮助或线索,我们将不胜感激。
编辑: 我应该提一下,当我访问 apps/name/course-codes 时,我确实得到了 JSON 的响应,正如 {"1":"Thing 1","2":"Thing 2"}
我 运行 你的代码在测试环境中,我通过将你的测试 JSON 调整为简单的 $results = array('Thing 1', 'Thing 2')
来让自动完成工作
我正在尝试让自动完成功能用于我的 Drupal 安装中的文本字段。这是一个大项目,我还不熟悉 Drupal 和这个大代码库。请假设我可以犯最简单的错误。
好的,所以我一直在学习有关如何让我的文本字段自动完成的简单教程。
我有一个 hook_menu():
/**
* Implements hook_menu().
*/
function mod_name_menu() {
$items = array();
// Not important for this question. This is the submit URL.
$items['apps/name/result'] = array(
'title' => t('Result page'),
'file' => 'mod_name.pages.inc',
'file path' => drupal_get_path('module', 'mod_name'),
'page callback' => 'drupal_get_form',
'page arguments' => array('mod_name_course_display_form'),
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
// This is the relevant one!
$items['apps/name/course-codes'] = array(
'file' => 'mod_name.pages.inc',
'file path' => drupal_get_path('module', 'mod_name'),
'page callback' => 'mod_name_course_code_list',
'page arguments' => array('access content'),
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
return $items;
}
我有一个相当大的表单可以使用,但文本字段的相关部分如下:
(mod_name.pages.inc)
function mod_name_basic_block_form($form, &$form_state) {
[...]
$form['search']['course_code'] = array(
'#id' => 'course-code-textbox',
'#type' => 'textfield',
'#title' => t('Course code'),
'#default_value' => (isset($_POST['course_code']) ?
strtoupper($_POST['course_code']) :
(isset($_GET['course_code']) ?
$_GET['course_code'] :
'')),
'#required' => FALSE,
'#size' => '20',
'#autocomplete_path' => 'apps/name/course-codes',
);
[...]
return $form;
}
[...]
/**
* Autocomplete for the course-code form.
*/
function mod_name_course_code_list($text) {
$results = array('1' => 'Thing 1', '2' => 'Thing 2');
drupal_json_output($results);
}
[...]
我暂时将回调函数保留为静态数组,以查看自动完成的行为方式。我希望当我在文本字段中键入内容时,throbber 应该会跳动,然后我会看到自动完成 "Thing 1"、"Thing 2" 或类似内容。但是,当我在文本字段中键入时,什么也没有发生。我确实在页面加载时看到一个灰色的跳动,但它在键入、模糊或单击时没有动画。
检查页面时,我发现 autocomplete.js 已加载到“网络”选项卡中。我还看到输入字段具有自动完成属性。我在 Firefox 和 Chrome 中都试过了,但都没有产生任何动作。
我正在使用Drupal 7.32
如果能提供任何帮助或线索,我们将不胜感激。
编辑: 我应该提一下,当我访问 apps/name/course-codes 时,我确实得到了 JSON 的响应,正如 {"1":"Thing 1","2":"Thing 2"}
我 运行 你的代码在测试环境中,我通过将你的测试 JSON 调整为简单的 $results = array('Thing 1', 'Thing 2')