HTML <输入>必需属性无法阻止表单在应用脚本应用中提交

HTML <input> Required Attribute Fails to Prevent Form from Submitting in Apps Script App

本文关键字:应用 表单 提交 脚本 输入 HTML 属性      更新时间:2023-09-26

我正在测试我在Google Apps Script中编写的一些代码。我要求我的字段包含文本,但是当我使用空字段对其进行测试时,服务器端代码无论如何都会运行。 代码会触发弹出窗口,说明字段是必填字段,但在弹出窗口上单击"确定"时提交表单。我已经测试了它,我填写了所有字段,然后完美地提交了上传的内容。我想我只是在我的"点击"中倒退了我的编码或其他东西。我有基本的编码知识,所以如果这是一个愚蠢的问题,我很抱歉。谢谢,谢谢,提前谢谢。

<p>
<form id="myForm">
  <h1>NHD Paper Upload</h1>
  <label>Name</label>
  <input type="text" name="myName" class="required" placeholder="Enter your full name..">
  <label>Division</label>
  <input type="text" name="myDivision" class="required" placeholder="(ex. Junior or Senior)">
  <label>School</label>
  <input type="text" name="mySchool" class="required" placeholder="Enter your school..">
  <label>Affiliate</label>
  <input type="text" name="myAffiliate" class="required" placeholder="Enter your affiliate..">
  <label>Select file to upload. Make sure your file is labeled in the following manner <b>LastName_Division_School_State.pdf</b></label>
  <input type="file" name="myFile">
  <input type="submit" value="Submit File" 
       onclick="validateForm();
                this.value='Please be patient while your paper is uploading..';
                google.script.run.withSuccessHandler(fileUploaded)
                .uploadFiles(this.parentNode);
                return false;">
  <br />
  <label><b>Once upload is successful please stay on this window to copy and paste the URL produced on the next screen into registration.</b></label>
   <br />
  <label><b>If you have any issues or questions please send an email to <a href="mailto:elaine@nhd.org">elaine@nhd.org</a>.</b></label>
</form>
</p>
<div id="output"></div>
<script>
    function validateForm() {
    var x=document.getElementsByClassName('required');
    for(var i = 0; i <x.length; i++){
       if (x[i].value == null || x[i].value == "")
       {
          alert("All fields must be filled out.");
          return false;
          }
       }
    }
    function fileUploaded(status) {
        document.getElementById('myForm').style.display = 'none';
        document.getElementById('output').innerHTML = status;
    }
</script>
<style>
 input { display:block; margin: 15px; }
 p {margin-left:20px;}
</style>

这是JavaScript

function doGet(e) {
  return HtmlService.createHtmlOutputFromFile('form.html');
}
function uploadFiles(form) {
  try {
    var dropbox = "NHD Papers";
    var folder, folders = DriveApp.getFoldersByName(dropbox);
    if (folders.hasNext()) {
      folder = folders.next();
    } else {
      folder = DriveApp.createFolder(dropbox);
    }
    var blob = form.myFile;    
    var file = folder.createFile(blob);    
    file.setDescription("Uploaded by " + form.myName + ", Division: " + form.myDivision + ", School: " + form.mySchool + ", State: " + form.myState);
    return "<h2>File uploaded successfully!</h2><p>Copy and paste the following URL into registration:<br /><br /><strong>" + file.getUrl() + '</strong></p>';
  } catch (error) {
    return error.toString();
  }
}

现在,google.script.run直接从提交按钮调用。

当前设置:

<input type="submit" value="Submit File" 
   onclick="validateForm();
            this.value='Please be patient while your paper is uploading..';
            google.script.run.withSuccessHandler(fileUploaded)
            .uploadFiles(this.parentNode);
            return false;">

如果您想防止在未填写填输入字段时运行google.script.run,我会尝试从 <form> 标记运行提交事件。

<form id="myForm" onsubmit="validateForm();
            this.value='Please be patient while your paper is uploading..';
            google.script.run.withSuccessHandler(fileUploaded)
            .uploadFiles(this);
            return false;">

确保将this.parentNode更改为仅this ,以便使用此设置。

作为个人喜好,我喜欢google.script.run它自己的功能。 您已经在使用单独的函数进行validateForm(),您可以将google.script.run放在该函数中:

将表单标记简化为:

<form id="myForm" onsubmit="validateForm()">

脚本

function validateForm() {
  var x=document.getElementsByClassName('required');
  for(var i = 0; i <x.length; i++){
    if (x[i].value == null || x[i].value == "")
    {
      alert("All fields must be filled out.");
      return false;
     }
      this.value='Please be patient while your paper is uploading..';
      var myFormObject = document.getElementById('myForm');
      google.script.run.withSuccessHandler(fileUploaded)
        .uploadFiles(myFormObject);
   }
}

由于该函数在窗体之外,因此不能再使用this.parentNode。 通过您的身份证获取表格。 示例代码中显示了一个选项。