var Ajax = {
send: function(object) {
var xhr = new XMLHttpRequest();
xhr.open(object.method, object.url, true);
xhr.send(object.data);
xhr.onreadystatechange = function() {
if (xhr.status != 200)
object.error(xhr.responseText);
else
object.success(xhr.responseText);
}
}
};
window.onload = function() {
// grab all forms with 'ajax_form' class
var forms = document.querySelectorAll('form.ajax_form');
for (var i = 0; i < forms.length; i++) {
forms[i].onsubmit = function(event) { // listener
event.preventDefault();
var inputs = this.querySelectorAll('input.active'),
query = '',
form = this;
for (var z = 0; z < inputs.length; z++)
query += inputs[z].getAttribute('name') + '=' + inputs[z].value + '&';
query = query.slice(0, -1);
console.log('listener launchd');
Ajax.send({
method: this.getAttribute('method'),
url: this.getAttribute('url'),
data: query,
success: function(responce) {
window['form_' + form.id]['success'](responce);
},
error: function(responce) {
window['form_' + form.id]['error'](responce);
}
});
}
}
};
form_WriteMe = {
success: function(text) {
alert('Спасибо за обращение!');
},
error: function(text) {
console.log('error handled');
}
};
<form id="WriteMe" class="ajax_form" url="/ajax/letter" method="POST">
<input name='test' class="active" value="1">
<input type="submit" value="Отправить">
</form>
在本地主机上 alert() 重复两次。不在沙箱中(。也许问题出在 jsk 本身,所以我将非常感谢任何性质的代码审查。//是的,这仍然是“垃圾代码”。告诉我如何做得更好:)

问题出在上面的函数中。有必要检查请求的状态。也就是说, readystatechange 被调用了几次 - 当改变xhr.readyState时。这就是为什么有必要检查请求是否已完成(状态 4)
非常感谢@Grundy