单击后如何禁用提交按钮?


13

Drupal似乎并没有阻止多次表单提交,即使在节点页面上也是如此。此质量检查建议将其修复在服务器端。

单击后如何禁用提交按钮?

还有其他解决方案吗?


Drupal的Form API不会由于其表单令牌值检查而阻止双重提交吗?不能两次提交具有相同令牌的表单?
Johnathan Elmore

Answers:


12

它仅在开发人员中,但是“ 隐藏提交”模块可以解决问题。功能之一是:

单击提交按钮后隐藏(或禁用)

我刚刚将其安装在开发站点上,并且似乎可以很好地用于节点添加表单。当您单击提交按钮时,它将被隐藏,并替换为加载图像和“请稍候...”消息,直到最终提交表单。我还没有尝试过任何其他形式。


关于如何使Hide Submit模块在您自己的自定义模块中的表单上工作的任何想法?我希望它可以在整个站点范围内使用,但事实并非如此。
user785179 '11

@ user785179看看它是如何实现的hook_form_alter()-如果正在使用hook_form_FORMID_alter(),请将其切换为generic hook_form_alter()。如果是通用的hook_form_alter(),如果在其中,则or在this中添加一些if
Mołot

请谨慎使用此解决方案-隐藏提交模块会中断ajax上传,导致自动完成问题,并且在某些情况下,导致提交按钮在第一次单击时根本不执行任何操作。我只需要从站点上将其卸载。
jenlampton

@Jen Strange,多年来我一直在数十个站点中使用它,而没有看到类似的问题。也许您安装了另一个会干扰它的模块
Clive

10

这是Drupal 7的解决方案。代码是“隐藏提交”模块的简化版本。

即使使用“添加更多”按钮和AJAX表单,此代码也可以正常工作。

Drupal.behaviors.hideSubmitButton = {
  attach: function(context) {
    $('form.node-form', context).once('hideSubmitButton', function () {
      var $form = $(this);
      $form.find('input.form-submit').click(function (e) {
        var el = $(this);
        el.after('<input type="hidden" name="' + el.attr('name') + '" value="' + el.attr('value') + '" />');
        return true;
      });
      $form.submit(function (e) {
        if (!e.isPropagationStopped()) {
          $('input.form-submit', $(this)).attr('disabled', 'disabled');
          return true;
        }  
      });
    });
  }
};

我想在行政主题中实现这一点。制作一个文件sitename.js并将上面的代码复制到其中。它不起作用。我应该调整一下吗?
Justme

@Justme,您将sitename.js文件放在哪里?如果在模块或子主题中,则需要将其添加到.info文件中以进行加载,或者在其他位置调用drupal_add_js()。您能看到它被添加到页面源中吗?
jenlampton

Thxs解决了它。我不知道这应该介于以下之间:(function($){and})(jQuery); 在js文件中。就像一个沙姆!
Justme,2013年

0

最简单的方法是执行基于主题的javascript解决方案,以在提交表单后禁用按钮。在theme.info文件中,放置您的JavaScript文件,以便可以由主题api加载它。

scripts[] = js/themename-script.js

现在,在themename-script.js中添加到Drupal.behaviors.themename部分,如下所示:

Drupal.behaviors.themename = function()
{
  $('.node-form').submit(function(){
    $('#edit-submit').attr("disabled", "disabled");
    $('#edit-preview').attr("disabled", "disabled");
  });
}

因此流程如下:

  1. 主题加载了JavaScript
  2. 在页面加载时触发Drupal.behaviors.themename
  3. 在节点添加表单的表单提交(基于上例的类,可以根据表单的类型进行自定义)上,禁用提交按钮(提交和预览),因此无法再次单击它

我敢肯定,如果进行一些ajax处理,则上述操作可能很危险,并且如果form_api验证中发现错误,则无法再次提交表单,因此请进行测试并自定义以满足您的需求。我禁用了这两个按钮,因为在禁用提交按钮后您仍然可以单击预览按钮。显然,您的里程数会有所不同。


2
您使用的是旧的Drupal.behaviors声明样式;它不适用于Drupal7。它必须是Drupal.behaviors.themename = { attach: function (context, settings) { // ...。有关更多信息,请参阅在Drupal 7中管理JavaScript
Clive

声明样式已固定
尤金·菲德林

应从此脚本“节点形式”替换哪些值?
pal4life

我试图让这个以行政主题运作,但没有运气。用adminimal重命名themename并将完整的代码复制到sitename.js中,并将其添加到主题信息文件中。我仍然可以轻松地获得更多具有相同形式的提交。
Justme
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.