当senderform
的方法是POST时,一切正常。但是,只要我将方法更改为GET,我就不会在服务器上收到任何内容。
function ajaxSubmit(destinationElement, senderform) {
var xmlreq = new XMLHttpRequest();
var params = new FormData(senderform);
xmlreq.open(senderform.method, senderform.action, true);
if (/\/content\.php$/.test(senderform.action))
xmlreq.onreadystatechange = receiveTable;
else xmlreq.onreadystatechange = receiveText;
xmlreq.send(params);
}
我知道我可以在Action地址的末尾manually append key-value pairs,但问题是我不知道哪个表单将通过哪些字段传递。
如果可能,我更喜欢原生的javaScript。
如何使用带有来自senderform的键值对的XMLHttpRequest发送GET请求,这些键值对指向Element(与POST请求的工作方式相同)?
答案 0 :(得分:2)
最后,我提供了此解决方案,该解决方案从senderform
表单引用中加载所有键值对。
function ajaxSubmit(destinationElement, senderform) {
var xmlreq = new XMLHttpRequest();
var params = new FormData(senderform);
if (senderform.method == 'get')
{
var firstRun = true;
for (var key of params.keys())
{
if (firstRun)
{
senderform.action += '?';
firstRun = false;
}
else senderform.action += '&';
senderform.action += key + "=" + params.get(key);
}
}
xmlreq.open(senderform.method, senderform.action, true);
if (senderform.action.indexOf('content.php')!==-1)
xmlreq.onreadystatechange = receiveTable;
else xmlreq.onreadystatechange = receiveText;
xmlreq.send(params);
}
结合@ tanc的答案和this article我能够解决我的问题。
答案 1 :(得分:1)
您确定问题不是PHP脚本吗?我没有看到https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#send()与FormData需要POST工作的参考,但如果PHP脚本从$ POST或其他东西(我的PHP生锈)中获取信息,则行为会有所不同。
答案 2 :(得分:0)
由于您无法在GET请求中创建可用的正文(请参阅下文),因此另一个选项是在网址中使用params。
function buildGetUrlParams(baseUrl, paramsObj) {
var builtUrl = baseUrl + "?";
Object.keys(paramsObj).forEach(function(key) {
builtUrl += key + "=" + paramsObj[key] + "&";
});
return builtUrl.substr(0, builtUrl.length - 1);
}
document.getElementById('finalUrl').innerText = buildGetUrlParams('http://test.url.com', { name:'James', occupation:'web design' });

<div id="finalUrl"></div>
&#13;
HTTP GET请求可以包含正文,但该正文没有语义含义。简单来说,这意味着服务器没有任何理由,也不知道如何处理GET请求的主体。如果可以编写可以执行此操作的服务器,那么根据HTTP/1.1规范,这将是不好的做法:
如果请求方法不包含实体主体的定义语义,则在处理请求时应该忽略消息体。
这基本上就是它无法正常工作的原因。如果要发送服务器能够响应的任何类型的数据,那么您需要使用不同的HTTP方法。
This answer也解释了这个问题。