【问题标题】:XMLHttpRequest to external form with textarea and checkboxXMLHttpRequest 到带有文本区域和复选框的外部表单
【发布时间】:2017-07-25 14:54:06
【问题描述】:

我正在尝试将 XMLHttpRequest 发送到包含文本区域和复选框的外部表单。我想将 textarea 中的文本(“将您的文本放入此框中”)替换为另一个字符串并取消选中该复选框,然后发送表单并获取结果。 形式或多或少是这样的:

<form name="aspnetForm" method="post" action="Tagger.aspx" id="aspnetForm" enctype="multipart/form-data">

      <input id="checkBoxOptions_0" type="checkbox" name="checkBoxOptions$0" checked="checked" />

      <textarea name="$txtbxInput" id="_txtbxInput">Put your text in this box.</textarea>

      <textarea name="$txtbxOutput" readonly="readonly" id="_txtbxOutput" class="output">Output box</textarea>

      <input type="submit" name="$btnTagIt" value="Tag It" id="_btnTagIt" class="sizeTopMargin" />
</form>

我已经尝试了使用两种不同选项的 XMLHttpRequest:第一个使用原始字符串返回 textarea 并默认选中复选框,第二个给出其中一行中解释的错误。

选项 1:

var data = "checkBoxOptions$0.checked=false"+"&$txtbxInput=New String Inserted";
var xhr = new XMLHttpRequest();
xhr.open('POST', "http://nlpdotnet.com/services/Tagger.aspx", true);
xhr.setRequestHeader("Content-type", "multipart/form-data");
xhr.onload = function () {
    var results = xhr.response;
}
xhr.send(data);

选项 2:

var formElement = document.getElementById("aspnetForm");
var formData = new FormData(formElement);//TypeError: Argument 1 of FormData.constructor is not an object
formData.append("$txtbxInput", "New String Inserted");

var xhr = new XMLHttpRequest();
xhr.open('POST', "http://nlpdotnet.com/services/Tagger.aspx", true);
xhr.setRequestHeader("Content-type", "multipart/form-data");
xhr.onload = function () {
    var results = xhr.response;
}
xhr.send(formData);

由于表单是外部的,我无法重新设计它的任何部分。有任何想法吗?谢谢!

【问题讨论】:

  • 您的data 字符串与multipart/form-data 的格式不正确。如果您要手动构建数据字符串,您可能应该使用application/x-www-form-urlencoded 格式。
  • 这是原始表格中指定的格式,如果我更改它没有任何变化。
  • 好吧,您的数据也不是 URL 编码形式。 URL 编码类似于param1=value1&amp;param2=value2。他们之间没有&amp;
  • 对于复选框,您不发送.checked 参数。如果选中,您只需发送checkboxname=value,如果未选中,则将其忽略。
  • 是的,它是 URL 编码的(拼写错误,现已更正),我在参数之间有 &。

标签: javascript checkbox xmlhttprequest textarea


【解决方案1】:

您不应该尝试使用getElementById 获取表单元素。表单不在当前页面的 DOM 中,它在一个完全不同的文档中,没有加载到浏览器中。

您只需要手动构造formData 和一堆add 调用:

var formData = new FormData;
formData.add("$txtbxInput", "New String Inserted");
formData.add("$btnTagIt", "Tag It");
var xhr = new XMLHttpRequest();
xhr.open('POST', "http://nlpdotnet.com/services/Tagger.aspx", true);
xhr.setRequestHeader("Content-type", "multipart/form-data");
xhr.onload = function () {
    var results = xhr.response;
}
xhr.send(formData);

【讨论】:

  • 谢谢,但是行“var formData = new FormData(formElement);”抛出错误:“TypeError: Argument 1 of FormData.constructor is not an object”,因此不执行以下行。
  • console.log(formElement); 显示什么?加载 DOM 后,您是否在事件侦听器中运行此代码?您确定var formElement = document.getElementById("aspnetForm"); 行中的 ID 正确吗?
  • console.log(formElement) 显示为空。我已经仔细检查了表单 ID,它是正确的。不,我不使用事件监听器。这是我与网站的第一次互动,这就是为什么我认为 formElement 为空,因为当我声明它时 DOM 仍未收费。我见过的所有示例都在同一个文档中包含 DOM 和 javascript 代码。
  • 你在哪里运行这段代码?它需要在 HTML 之后,或者您需要在 window.onload 中运行它。见stackoverflow.com/questions/14028959/…
  • 为什么在用户有机会输入之前提交表单?
猜你喜欢
  • 2022-07-02
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多