【问题标题】:POST javascript variable to JSON on form submit在表单提交时将 javascript 变量发布到 JSON
【发布时间】:2020-11-25 11:19:27
【问题描述】:

我需要将数字格式传递给 JSON,并且我不能使用隐藏的输入类型,因为它返回字符串。我有 const formDataJsonString = JSON.stringify(plainFormData); 将表单数据转换为 JSON(见下文)

如何使用我在下面添加的函数将 javascript 变量从表单发布到 JSON?

我写这个是为了把它转换成数字,但不知道如何将 javascript 变量提交到 JSON。

<input type="hidden" class="number" name="applicationType" value=3>

$("#form").submit(function(){
    var formInfo = document.forms['form'];
    var applicationType = parseInt($(".number").val());
});

JSON 中的期望结果:

applicationType: 3

代替:

applicationType: "3"

更新 1: 所以我有这个把它变成JSON,然后发布它:

//url is the api
async function postFormDataAsJson({ url, formData }) {
    const plainFormData = Object.fromEntries(formData.entries());
    
//put all accountsToLink value into an array
plainFormData["accountsToLink"] = new Array //create array
$("input[name=accountsToLink] ").each(function() {
plainFormData["accountsToLink"].push($(this).val()) //push value in array
});

    const formDataJsonString = JSON.stringify(plainFormData);
    const fetchOptions = {
        method: "POST",
        headers: {
            "Content-Type": "application/json",
            Accept: "application/json",
        },
        body: formDataJsonString,
    };
    const response = await fetch(url, fetchOptions);
    if (!response.ok) {
        const errorMessage = await response.text();
        throw new Error(errorMessage);
    }
    else if (response.ok) {
        window.location.href = "confirmation.html";
    }
    return response.json();
}



async function handleFormSubmit(event) {
    event.preventDefault();
    const form = event.currentTarget;
    const url = form.action;
    try {
        const formData = new FormData(form);
        const responseData = await postFormDataAsJson({ url, formData });
        console.log({ responseData });
    } catch (error) {
        console.error(error);
    }
}
const testform = document.getElementById('testform');
testform.addEventListener('submit', handleFormSubmit);

【问题讨论】:

  • 用你给我们看的代码,数字不太可能变成字符串
  • 我想你可能误解了我的意思。因为隐藏的输入类型给了我applicationType:“3”。我正在处理不完整的 jquery 以将其转换为数字,并希望从 jquery 发布变量,就像普通表单在隐藏输入类型的情况下一样。
  • 我只看到您提供的代码 applicationType = parseInt($(".number").val() 并且使用该代码您有一个数字 - 当您 JSON.stringify 它时,正如我在我的回答中显示的那样
  • 请显示将其转换为 API 的 JSON 的代码
  • 好的,我已经更新了我的问题,请看一下。

标签: javascript json forms input hidden


【解决方案1】:

所以你没有提到你没有做你在最初的帖子中所做的事情,而是你使用了 formData

您不能将 formData 用于 JSON 整数。

您可以映射一个序列化数组并将其字符串化

async function postFormDataAsJson({ url, formData }) {
  const formDataJsonString = JSON.stringify(formData);
  console.log(url,formDataJsonString)
  // ....
}


async function handleFormSubmit(event) {
  event.preventDefault();
  const form = event.currentTarget;
  const url = form.action;
  try {
    const formData = $(form).serializeArray().map(
      item => ({ [item.name]: isNaN(item.value) ? item.value : +item.value})
    );
    const responseData = await postFormDataAsJson({ url, formData }); 
  } catch (error) {
    console.error(error);
  }
}

$("#testform").on("submit", handleFormSubmit);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="testform" action="/bla.php">
  <input type="hidden" class="number" name="applicationType" value=3>
  <input type="submit" />
</form>

【讨论】:

  • 嗨,是的,我写的函数确实是返回数字,这正是我想要的。但是我如何提交它,就像隐藏输入类型的普通表单一样。如果我不够清楚,请告诉我。谢谢!
  • 感谢您的回复,并对误解表示歉意。你的方法似乎有效。但是通过查看 json,似乎所有隐藏该值是数字的输入类型都变成了数字,甚至没有转换它们。我能问一下我的 'async function postFormDataAsJson({ url, formData })' 会发生什么吗?我对将此函数设置为与您提供的 serializeArray 一起使用感到困惑。非常感谢!
  • 你砍了它。我的 serialisedForm 在您的第二个函数中替换了您的 formData:const serialisedForm = $(form).serializeArray().map(item =&gt; ({[item.name]:isNaN(item.value)?item.value:+item.value})); const responseData = await postFormDataAsJson({url,serialisedForm});
  • +item.value 中的一元加号将任何不是 isNaN 的内容转换为数字
  • 我明白了。谢谢(你的)信息。切碎的意思是去掉?抱歉,因为我是这方面的初学者,所以我不确定如何修改第一个函数以使它们组合在一起。您能帮我更新一下吗?谢谢一百万!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多