如何使表单按钮仅调用javascript?


9

我正在尝试使用JavaScript和Drupal表单。目前,我正在尝试以模块的管理形式创建一个按钮,该模块将使用JavaScript将选项附加到选择列表中。我遇到的问题是,当我单击按钮时,我的JavaScript会被调用,但整个表单会刷新。我查看了Forms API参考,认为可以在按钮上设置某种属性来阻止它,但是什么也没找到。有什么办法可以阻止按钮刷新页面,或者这是死路一条?

$form['#attached']['js'] = array(
  drupal_get_path('module', 'test').'/js/test.js',
);

$form['list'] = array(
  '#type' => 'select',
  '#options' => array(),
  '#attributes' => array(
    'name' => 'sellist',
  ),
  '#size' => 4,
);

$form['add_button'] = array(
  '#type' => 'button',
  '#value' => 'Add',
  '#attributes' => array(
    'onclick' => "add_to_list(this.form.sellist, 'Append' + this.form.sellist.length);",
  ),
);

//JavaScript
function add_to_list(list, text) {
  try {
    list.add(new Option(text, list.length), null) //add new option to end of "sample"
  }
  catch(e) {
    list.add(new Option(text, list.length));
  }
}

我的最终代码:

<?php
function jstest_menu() {
  $items['admin/config/content/jstest'] = array(
    'title' => 'JavaScript Test',
      'description' => 'Configuration for Administration Test',
      'page callback' => 'drupal_get_form',
      'page arguments' => array('_jstest_form'),
      'access arguments' => array('access administration pages'),
      'type' => MENU_NORMAL_ITEM,
  );

  return $items;
}

function _jstest_form($form, &$form_state) {
  $form['list'] = array(
    '#type' => 'select',
    '#options' => array(),
    '#size' => 4,
  );

  $form['text'] = array(
    '#type' => 'textfield',
  );

  $form['add_button'] = array (
    '#type' => 'button',
    '#value' => t("Add"),
    '#after_build' => array('_jstest_after_build'),
  );
  return $form;
}

function _jstest_after_build($form, &$form_state) {
  drupal_add_js(drupal_get_path('module', 'jstest').'/js/jstest.js');
  return $form;
}

JavaScript
(function ($) {
  Drupal.behaviors.snmpModule = {
    attach: function (context, settings) {
      $('#edit-add-button', context).click(function () {
        var list = document.getElementById('edit-list');
        var text = document.getElementById('edit-text');

        if (text.value != '')
        {
          try {
            list.add(new Option(text.value, list.length), null);
          }
          catch(e) {
            list.add(new Option(text.value, list.length));
          }

          text.value = '';
        }

        return false;
      });
      $('#edit-list', context).click(function () {
        var list = document.getElementById('edit-list');

        if (list.selectedIndex != -1)
          list.remove(list.selectedIndex);

        return false;
      });
    }
  };
}(jQuery));

Answers:


4

最简单的方法是在您的JavaScript代码中返回false:

function add_to_list(list, text) {
  try {
    list.add(new Option(text, list.length), null);
    return false;
  } catch(e) {
    list.add(new Option(text, list.length));   
    return false;
  }
}

或者更好的方法是使用行为:

Drupal.behaviors.some_action = function(context) {
  $('#id-button:not(.button-processed)',context)
  .addClass('button-processed').each(function() {

    //whatever you want here
    return false;
  });
}

1
感谢您向我指出行为,事实上,我现在正在阅读有关内容。由于某种原因,返回false对我不起作用;该页面仍在刷新= /。对于后续问题,您应该如何处理阻止/禁用javascript的用户?
Sathariel 2011年

如果将按钮放在<form> </ form>标记之外,则不会提交,但不建议这样做,更常规的方法是使用javascript。如果您的表单仍在刷新,请检查是否还有其他JavaScript显示错误或类似的信息。
Gnuget 2011年

Drupal.Behaviors代码放在哪里?在javascript文件中?


7

下面的表单按钮定义对我有用,#after_build可用于加载可附加点击处理程序的javascript。

$form['add_button'] = array (
  '#type' => 'button',
  '#attributes' => array('onclick' => 'return (false);'),
  '#value' => t("Add"),
);

$form['#after_build'] = array('[module_name]_after_build');

然后,我的javascript通过after build函数加载到一个单独的文件中,看起来像:

Drupal.behaviors.[module_name] = function(context) {
  $('#edit-add-button').click(function() {
   ...Do something here
  });
};

After_build对我不起作用。它引发了一个致命错误:调用未定义的函数[module_name] _after_build()。如果我用空主体定义方法[module_name] _after_build(),则窗体不会呈现。您能否进一步说明如何使用它?
sumanchalki

抱歉,我没有看到这个问题...我假设您要用模块的实际名称替换[module_name]?
马尔克斯

$ form ['#after_build']用于添加服务器端(PHP)函数-不是用于指定后期构建JavaScript。api.drupal.org/api/drupal/…–
基督教徒

3

您可以return false在函数调用之后在按钮表单元素的属性行内添加语句:

'#attributes' => array(
   'onclick' => "add_to_list(this.form.sellist, 'Append' + this.form.sellist.length); return false",
),

我认为更好的选择是添加一个外部事件侦听器,而不是将其全部放入内联onclick事件中。
基督教徒

0

理想情况下,请阅读Drupal自己的AJAX(或AHAH)表格功能。真正的基本介绍在这里 http://drupal.org/node/752056

否则,我很惊讶它刷新页面,因为它只是一个“按钮”,而不是提交或其他任何东西。

是否需要javascript返回false,就像在链接上阻止它跳回到页面顶部一样?


实际上,我试图避免使用AJAX,因为我试图做的主要是在客户端。直到提交表单后,服务器才需要数据。至于返回JavaScript中的内容,我尝试返回true,false和null,没有区别。
Sathariel 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.