2017-09-24 16 views
2

我在用户使用JQuery单击提交按钮时提交表单。但是点击它会多次提交相同的表单,我不知道为什么会发生这种情况。尝试了很多东西,但都失败了。以下是代码。相同的PHP函数使用JS提交多个时间。提交

我在下面添加我的PHP,Javascript和HTML代码。

HTML:

<div class="box-body big"> 
     <form id="pdf-generator" action="<?= $this->base; ?>/companies/generatePdf/" method="post" target="_blank"> 

      <select id="pdfname" class="form-control" name="pdfname"> 

       <option value="showfields">---Show Available Fields---</option> 
       <option value="29300____test1.pdf">29300____test1.pdf</option> 
      </select> 
      <input type="hidden" name="fieldPairs" id="fieldPairs" value="" /> 
     </form> 


     <div class="divide-12"></div> 
     <button id="genPdfFormButton" type="button" class="btn btn-success pull-right">Generate PDF</button> 
     <div class="divide-12"></div> 
</div> 

JS:

 $('#genPdfFormButton').click(function(){ 

     var elements = document.getElementsByTagName("input"); 
     var textAreas = document.getElementsByTagName("textarea"); 

     var list = ""; 
     var pair = ""; 

     document.getElementById("fieldPairs").value = ''; 
     //all input fields 
     for (var i=0; i<elements.length; i++) { 
      pair = elements[i].id + "=" + elements[i].value; 
      list = (list.length == 0) ? pair : list + "|" + pair; 
     } 
     //all textareas 
     for (var i=0; i<textAreas.length; i++) { 
      pair = textAreas[i].id + "=" + textAreas[i].value; 
      list = (list.length == 0) ? pair : list + "|" + pair; 
     } 

     document.getElementById("fieldPairs").value = list; 

     $('#pdf-generator').submit(); 
    }); 

PHP:

public function generatePdf() { 
    $this->log("==>===============[start]=====================", 'debug'); 
    $this->autoRender = false; 

    $pdfName = $this->request->data['pdfname']; 

    //get the submitted data 
    $formData = $this->processFormData($this->request->data['fieldPairs']); 

    if($pdfName == "showfields") { //show only form data fields 
     var_dump($formData); 
    } else { //generate PDF file 

     $this->log("==> gonna call generatePdf <== ", 'debug'); 
     $pdf = new PdfForm(PDF.$pdfName, $formData); 
     $pdf->download(); 
    } 
} 

当此代码调用PHP函数,我可以看到相同的日志消息多次因为函数被称为多次。

p.s:这个问题不是由于多次点击提交按钮。

+0

对于初学者,您绝对不应该根据请求数据运行操作,而不必执行请求方法!即[**检查它是一个POST请求**](https://book.cakephp.org/2.0/en/controllers/request-response.html#inspecting-the-request),也许[**失败难无效请求**](https://book.cakephp.org/2.0/en/controllers/request-response.html#CakeRequest::allowMethod)。 ps,请始终提及您的确切CakePHP版本('vendor/cakephp/cakephp/VERSION.txt'或'lib/Cake/VERSION.txt'中的最后一行) - 谢谢! – ndm

+0

我的cakephp版本是2.4.6。最初,我认为这个问题与JS有关。但是现在我意识到如果我删除pdf = new PdfForm(PDF。$ pdfName,$ formData);代码,它只打印一次日志。但是当这个代码在那里..它运行多次。任何线索? – ManinGreen

回答

0

因此浪费了大量的时间和调试大量的代码后,我固定的问题。这是由于我的浏览器中安装了IDM(Internet下载管理器)扩展。我禁用了它,一切开始按预期工作,函数现在只执行一次。

phew!

1

你应该每次禁用按钮,用户点击提交

$('#genPdfFormButton').click(function(){ 
    $(this).prop('disabled', 'disabled'); 
    ... 
} 
+0

这不是解决方案,因为问题不是由于多次单击表单按钮造成的。 – ManinGreen

+0

最好禁用表单提交上的提交按钮而不是监听点击事件。如果表单数据不多次提交很重要,这是一个很好的做法。但是,听起来好像OP代码中存在一个需要首先修复的错误。 – drmonkeyninja

+0

in'$ pdf-> download();'有代码强制浏览器下载文件。我强迫它使用标题和其中一个标题创建问题。也就是'header(“Content-Disposition:attachment; filename = {$ finalFileName}”);'如果我删除它或者将文件扩展名从PDF改为其他东西,函数不会再次调用。任何线索? – ManinGreen