下面的代码似乎不起作用,因为当我试图在谷歌应用程序引擎(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
中,以澄清什么是"chooser",正如Daniel Roseman的评论:
在/choice
处理程序中,我有writeToStorage()
,它以user1, user2
等形式分配用户名,并将其写入localStorage
。
将用户名写入localStorage
后,我还需要将其写入应用程序中的数据库,并使用xhr
将其发送给/g/choicehandler
处理程序。
我想"chooser"是一个字符串,由
组成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
我注意到在日志中,文本区域的文本是"选择"one_answers"选择器",这是用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()
所以在数据存储中,我看到"chooser"one_answers"choice"写在2个不同的行中。我做错了什么?
实际上您提交了两次表单。一旦在writeToStorage通过AJAX,也与普通的方式与表单。你必须改变两件事。
-
writeToStorage
必须返回false
作为最后一个动作 - 将
onsubmit
更改为onsubmit="return writeToStorage()"
这样可以防止表单的默认提交,因为它将通过writeToStorage