以下代码似乎不起作用,因为当我尝试在Google App Engine(Python)中获取“选择器”时,它是未定义的:
chooser = self.request.get("chooser")
self.response.out.write("chooser: %s " % chooser)
#returns "chooser:" without any value
这是有效的JavaScript吗?
var formData = new FormData();
formData.append("chooser", user);
var xhr = new XMLHttpRequest();
//is it ok to test this with localhost?
xhr.open("POST", "http://localhost:8086/g/choicehandler", true);
xhr.onreadystatechange = function (aEvt) {
if (xhr.readyState == 4 && xhr.status == 200){
console.log("request 200-OK");
}
else {
console.log("connection error");
}
};
xhr.send(formData);
XHR呼叫或应用程序有问题吗?
更新
我将代码包含在
/choice
中,以根据丹尼尔·罗斯曼(Daniel Roseman)的评论来澄清什么是“选择器”:在
/choice
处理程序中,我具有writeToStorage()
,它以user1, user2
形式分配用户名,依此类推,并将其写入localStorage
。将用户名写入
localStorage
之后,我还需要将其写入应用程序中的数据库,然后使用xhr
将其发送给/g/choicehandler
处理程序。因此,“选择器”,我相信是一个弦,由
var user = "user" + count;
我在下面复制
/choice
处理程序:class Choice(webapp.RequestHandler):
def get(self):
self.response.out.write("""
<html>
<head>
<script type="text/javascript">
var count = 0;
function writeToStorage()
{
var user = "user" + count;
count++;
localStorage.setItem("chooser", user);
var formData = new FormData();
formData.append("chooser", user);
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://localhost:8086/g/choicehandler", true);
xhr.onreadystatechange = function (aEvt) {
if (xhr.readyState == 4 && xhr.status == 200){
console.log("request 200-OK");
}
else {
console.log("connection error");
}
};
xhr.send(formData);
};
</script>
</head>
<body>
<form name="choice_form" id="choice_form" action="/g/choicehandler" method="post" onsubmit="writeToStorage()">
<textarea name="choice" rows="7" cols="50"></textarea><br />
<input type="submit" value="submit your choice">
</form>
</body>
</html>""")
更新2
我在日志中注意到,来自textarea的文本“选择”和随xhr发送的“选择器”未一起显示,其中之一始终没有值:
INFO ... chooser: user0 choice:
INFO ... chooser: choice: abcd
INFO ... chooser: user0 choice:
INFO ... chooser: choice: efgh
这是上面的日志的代码:
chooser = self.request.get("chooser")
choice = self.request.get("choice")
logging.info("chooser: %s choice: %s" % tuple([chooser, choice]))
new_choice = User(
choice = choice,
owner = chooser)
new_choice.put()
因此,在数据存储区中,我看到“选择器”和“选择”分别写在2行中。我究竟做错了什么?
最佳答案
实际上,您要提交两次表单。一旦通过AJAX进入writeToStorage并以正常方式与表单一起使用。您将不得不更改两件事。writeToStorage
必须返回false
作为最后一个动作
将您的onsubmit
更改为onsubmit="return writeToStorage()"
这样,您将阻止表单的默认提交,因为它将通过writeToStorage中的AJAX完成
关于javascript - 我可以在localhost的SDK中测试XMLHttpRequest()吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8114926/