我可以使用localhost在SDK中测试XMLHttpRequest()吗?

时间:2011-11-13 21:35:19

标签: javascript python google-app-engine xmlhttprequest

以下代码似乎不起作用,因为当我尝试在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个不同的行中。我究竟做错了什么?

1 个答案:

答案 0 :(得分:1)

其实你提交表格两次。一旦通过AJAX进入writeToStorage并且还以正常方式使用表单。你将不得不改变两件事。

  1. writeToStorage必须返回false作为最后一项操作
  2. 将您的onsubmit更改为onsubmit="return writeToStorage()"
  3. 这样您就可以阻止默认提交表单,因为它将通过writeToStorage中的AJAX完成