javascript - 动态 html 表单数据 AJAX 重定向到谷歌表格错误
问题描述
我正在努力将表单数据从动态用户表单发送到谷歌表格页面。有 140 个潜在形式的语料库,随机显示 20 个用户。我在控制台中没有收到任何错误,但没有填充谷歌表。我知道 sheet gs 脚本没问题,因为在更简单的用例下连接工作正常。
我在下面包含了 html 和 js 代码。该网站在我的本地机器上呈现良好。图像和形式的内容也很有效。
<!DOCTYPE html>
<body>
<!-- Required JS packages for this project-->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js">
</script>
<script src="jquery-3.3.1.min.js"></script>
<script src="require.js"></script>
<!--Create empty form element -->
<div id = "form_submit"></div>
<!-- JS function to fill form element with 20 hold type questions forms -->
<script>
// Establish file name to hold mapping with two lists and a dict to link elements
var files = ['1.png', '10.png', ..., '98.png', '99.png']
var numWords = ["one", "two", "three",.., "one_hundred_and_fifty"]
var numWordDict = { 1: 'one', ..., 150: 'one_hundred_and_fifty' } // Generate list of 20 random digits that will select holds to be classified
// Create array of twenty random holds
var idx = []
for (var j = 0; j < 20; j++) {
idx.push(Math.floor(Math.random() * 140) + 0)
}
console.log(idx)
// Loop over array and make a form element for each hold within the div element
$(document).ready(function (list) {
for (var i = 0; i < idx.length; i++) {
// retrieve mapped index
var randHoldIdx = idx[i]
// build path to hold image
var holdPath = files[randHoldIdx]
var numb = holdPath.match(/\d/g);
numb = numb.join("");
var colName = numWordDict[numb]
var form_name = 'submit-to-google-sheet' + numb
const scriptURL = 'https://script.google.com/macros/s/AKfycbyhMLuTGNkaNOxeNCOx_t1ERThZT8VEYDcMmiQhj773kIrUuRA/exec'
// Form element contents will be appended into the div element with id = form_submit
$("#form_submit").append(
// html form skeleton for users to select jug,pinch, crimp, pocket or undercling from radio button
// options
"<form name = " + form_name + ">"+
"<input type='radio' name = " +colName + " class=" + String(colName) +" value=1>Jug<br>" +
"<input type='radio' name = " + colName + " class=" + String(colName) +" value=2>Pinch<br>" +
"<input type='radio'name = " +colName + " class=" + String(colName) +" value=3>Crimp<br>"+
"<input type='radio' name = " +colName + " class=" + String(colName) +" value=4>Pocket<br>"+
"<input type='radio' name = " +colName + " class=" + String(colName) +" value=5>Undercling"+
// Submit button for form, close form
"<button type='submit'>Submit!</button></form>"+
// image of climbing hold in question with coordinates to position on moonboard
"<div><img src=labelled_imgs/" +String(holdPath) +" alt='selected hold'></div>");
var form = document.forms[form_name]
window.onload=function(){
form.addEventListener('submit', e => {
e.preventDefault()
fetch(scriptURL, { method: 'POST', body: new FormData(form) })
.then(response => console.log('Success!', response))
.catch(error => console.error('Error!', error.message))
})
}
}
});
</script>
</body>
解决方案
问题:
您
window.onload
每次都在循环中为每个表单重写函数。只有最后一个表单的提交事件将被禁用onload
并提交到服务器。当您创建一个随机数字数组时,不能保证它是唯一的。如果两个表单最终具有相同的名称,则只会阻止第一个表单的提交事件。
解决方案:
由于表单已经附加,直接在循环内为每个表单运行函数,无需编写
window.onload
var form = document.forms[form_name] form.addEventListener('submit', e => { e.preventDefault(); fetch(scriptURL, { method: 'POST'.....
做
Idx
独一无二的:idx = [...new Set(idx)]
推荐阅读
- python-3.x - 使用 pip3 安装 SymPy 无法正常工作
- javascript - 清除自动完成建议
- javascript - 在 Xenial 上安装后,新版本的 node.js 不显示
- python - Python/Pandas Dataframe - 当 0 舍入到 n 位小数时,用 int 值替换小数精度
- c - 在 BST - C 中找到最大元素的索引
- php - PHP 的 urldecode 和 AS3 的 unescape 的区别?
- c# - 我怎样才能把异步任务
- > 进入 BindableCollection<>
- amazon-cognito - 有没有办法限制 AWS Cognito 用户或组(来自用户池)访问在池中注册的某些客户端?
- php - 如何忽略 PHP_CodeSniffer 警告
- mysql - MySQL 未运行,但 Mac 中存在 PID 文件