以下代码似乎不起作用,因为当我尝试在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/

10-08 21:41