我可以测试XMLHttpRequest()在SDK与localhost



下面的代码似乎不起作用,因为当我试图在谷歌应用程序引擎(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,也与普通的方式与表单。你必须改变两件事。

  1. writeToStorage必须返回false作为最后一个动作
  2. onsubmit更改为onsubmit="return writeToStorage()"

这样可以防止表单的默认提交,因为它将通过writeToStorage

中的AJAX完成。

最新更新