以下代码似乎不起作用,因为当我尝试在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呼叫或App的问题是什么?
更新
我在/choice
中包含代码,以澄清丹尼尔罗斯曼评论中的“选择器”:
在/choice
处理程序中,我writeToStorage()
以[{1}}形式分配用户名,依此类推,并将其写入user1, user2
。
将用户名写入localStorage
后,我还需要将其写入应用程序中的数据库,然后使用localStorage
将其发送给xhr
处理程序。
所以,“选择器”,我相信是一个由
组成的字符串/g/choicehandler
我在下面复制var user = "user" + count;
处理程序:
/choice
更新2
我在日志中注意到textarea中用“xhr”发送的“选择”和“选择器”的文本没有一起显示,其中一个总是没有值:
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>""")
这是上述日志的代码:
INFO ... chooser: user0 choice:
INFO ... chooser: choice: abcd
INFO ... chooser: user0 choice:
INFO ... chooser: choice: efgh
所以在数据存储区中我看到“chooser”和“choice”写在2个不同的行中。我究竟做错了什么?
答案 0 :(得分:1)
其实你提交表格两次。一旦通过AJAX进入writeToStorage并且还以正常方式使用表单。你将不得不改变两件事。
writeToStorage
必须返回false
作为最后一项操作onsubmit
更改为onsubmit="return writeToStorage()"
这样您就可以阻止默认提交表单,因为它将通过writeToStorage中的AJAX完成