Como desativar o botão enviar depois de clicar?

13

O Drupal parece não impedir o envio de vários formulários, mesmo nas páginas dos nós. Esse controle de qualidade sugere corrigi-lo no lado do servidor.

Como posso desativar o botão enviar depois de clicar?

Alguma outra solução?

uwe
fonte
A API de formulários do Drupal não impede o envio duplo, graças à verificação do valor do token do formulário? Não é possível enviar um formulário com o mesmo token duas vezes?
Johnathan Elmore

Respostas:

12

É apenas no dev, mas o módulo Ocultar envio faria o truque. Um dos recursos é:

Oculte (ou desative) o botão enviar depois que ele foi clicado

Acabei de instalá-lo em um site de desenvolvimento e parece funcionar bem para adicionar formulários de nó; quando você clica no botão enviar, ele é oculto e substituído por uma imagem carregada e uma mensagem 'Aguarde ...', antes que o formulário seja finalmente enviado. Eu ainda não tentei de nenhuma outra forma.

Clive
fonte
Alguma idéia de como fazer com que o módulo hide submit funcione em formulários em seus próprios módulos personalizados? Eu esperava que o site fosse amplo, mas isso não parece ser o caso.
user785179
@ user785179 veja como implementa hook_form_alter()- se estiver usando hook_form_FORMID_alter(), mude para genérico hook_form_alter(). Se for genérico hook_form_alter()com if inside, adicione alguns ornisto if.
Mołot 30/08/2013
Tenha cuidado com esta solução - o módulo ocultar envio interrompe os uploads do ajax, causa problemas de preenchimento automático e, em alguns casos, faz com que o botão enviar não faça nada no primeiro clique. Eu apenas tive que desinstalá-lo de um site.
precisa saber é o seguinte
@ Jen Strange, eu tenho usado em dezenas de sites há anos sem ver nenhum problema como esse. Talvez você tenha outro módulo instalado que interfira nele
Clive
10

Aqui está a solução para o Drupal 7. O código é uma versão simplificada do módulo Hide Submit.

Esse código funciona bem mesmo com os botões "Adicionar mais" e os formulários 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;
        }  
      });
    });
  }
};
Eugene Fidelin
fonte
Eu quero implementar isso no tema administrativo. Criou um arquivo sitename.js e copiou o código acima para ele. Não está funcionando. Devo ajustar as coisas?
Justme 16/11/16
@Justme, onde você colocou o seu arquivo sitename.js? Se em um módulo ou subtema, você precisará adicioná-lo ao arquivo .info para carregá-lo ou chamar drupal_add_js () em outro lugar para obtê-lo na página. Você pode vê-lo sendo adicionado na fonte da página?
precisa saber é o seguinte
Thxs resolveu isso. Eu não sabia que isso deveria estar entre: (function ($) {e}) (jQuery); no arquivo js. Funciona como um tubarão !!
Justme
0

A maneira mais fácil é fazer uma solução javascript baseada em tema para desativar o botão após o envio do formulário. No arquivo theme.info, coloque seu arquivo javascript para que ele possa ser carregado pela API do tema.

scripts[] = js/themename-script.js

Agora, em themename-script.js, adicione à seção Drupal.behaviors.themename para se parecer com o seguinte:

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

Portanto, o fluxo é o seguinte:

  1. O tema carrega o javascript
  2. O Drupal.behaviors.themename é acionado no carregamento da página
  3. No envio de formulário do nó, adicione formulário (classe com base no exemplo acima, ele pode ser personalizado no tipo de formulário) desative os botões de envio (envio e visualização) para que não possa ser clicado novamente

Tenho certeza de que, se houver algum processamento ajax, o acima exposto pode ser perigoso e o envio do formulário nunca poderá ser feito novamente se um erro for detectado na validação do form_api, teste-o e personalize-o para atender às suas necessidades. Desativei os dois botões, pois você ainda pode clicar no botão de visualização enquanto o botão Enviar estiver desabilitado. Obviamente sua milhagem pode variar.

Socorro
fonte
2
Você está usando o velho Drupal.behaviorsestilo de declaração; não funcionará para o Drupal 7. Seria necessário Drupal.behaviors.themename = { attach: function (context, settings) { // .... Consulte Gerenciando JavaScript no Drupal 7 para obter mais informações
Clive
Estilo de declaração corrigido
Eugene Fidelin 6/11/12
Quais valores devem ser substituídos nesse script 'node-form'?
pal4life
Eu tentei fazer isso funcionar no tema administrativo, mas sem sorte. Renomeie o nome do nome com adminimal e copiei o código completo em sitename.js e adicione-o ao arquivo de informações do tema. Ainda assim, recebo facilmente mais envios do mesmo formulário.
Justme 16/11/16