2011-11-13 113 views
1

下面的代碼似乎沒有工作,因爲當我試圖讓「選配」在谷歌的App Engine(Python)的是未定義:我可以使用本地主機在SDK中測試XMLHttpRequest()嗎?

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調用還是與應用程序?

UPDATE

我包括在/choice代碼來澄清「選配」是按照丹​​尼爾·羅斯曼的評論:

/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

我的發現記錄從xhr發送的「選擇」和「選擇器」的textarea文本不會一起顯示,其中一個始終沒有值:

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個不同的行。我究竟做錯了什麼?

+1

只要使用這個腳本的頁面也從localhost提供就可以了:8086 –

+0

'選擇器'應該是什麼? –

+0

你確定'user'在你的javascript中有一個值嗎?你有沒有嘗試用字符串文字替換它進行測試? –

回答

1

其實你提交表單兩次。一旦在通過AJAX寫入toToStorage並且以正常方式使用表單。你將不得不改變兩件事。

  1. writeToStorage必須返回false作爲最後一個動作
  2. 更改onsubmitonsubmit="return writeToStorage()"

這種方式,您可以防止默認提交表單的,因爲它會通過AJAX在writeToStorage完成

相關問題