JQuery “get”失败(使用Google App Engine作为后端)
我想做的事情其实很简单,但显然出了点问题。
在前端:
function eval() {
var x = 'Unchanged X'
$.get("/", { entry: document.getElementById('entry').value },
function(data){
x = data;
}
);
$("#result").html(x);
}
在后端:
class MainHandler(webapp.RequestHandler):
def get(self):
path = os.path.join(os.path.dirname(__file__), 'index.html')
if self.request.get('entry') != '':
#self.response.out.write({'evalresult': self.request.get('entry')})
self.response.out.write(request.get('entry'))
else:
self.response.out.write(template.render(path, {'result': 'Welcome!!'}))
def main():
application = webapp.WSGIApplication([('/', MainHandler)],
debug=True)
wsgiref.handlers.CGIHandler().run(application)
但是,显然这个函数从来没有被调用,#result的值被设置成了'Unchanged X'。我漏掉了什么呢?
注意:回调函数没有被调用。我通过在回调函数里放一个alert("Test")来确认这一点。有没有人有什么想法?
3 个回答
如果你的回调函数没有运行,可以试着把$.get换成$.ajax(),并添加一个错误回调,这样可以看看服务器是否返回了错误。
更好的办法是,在firebug的“网络”面板中查看服务器的响应,这样可能帮助你找到后端的问题所在。
另外,一旦问题解决了,你可能想把$.get换成简单的$().load,这样可以自动把数据放到div里:
$('#result').load('/', { entry: document.getElementById('entry').value });
编辑:我想下面的写法会更符合jQuery的风格:
$('#result').load('/', { entry: $('#entry').val() });
这段代码 $("#result").html(x);
是放在 get()
函数的回调里面的。
首先,我们有一个简单的错误:
<font size="3" face="Trebuchet MS">Speak Your Mind: </font><input type="text"
size="60" id="entry"/> <img valign="bottom" src='/assets/cognifyup.png'
onMouseOver="over()" onMouseOut="out()" onMouseDown="out(); evaluate();"
onMouseUp="over()"><br><br>
在调用 over()
和 out()
后面需要加分号(明白了吗?--- 抱歉,我忍不住)
其次(这是一个更微妙的问题):
如果我们打算把 get()
换成 getJSON()
,(你可能注意到了,这也是我在注释的 Python 代码中想要实现的,返回一个字典),那么我们需要在 self.request.get('entry')
周围加上 str()
。所以,
self.response.out.write({'evalresult': self.request.get('entry')})
就变成了:
self.response.out.write({'evalresult': str(self.request.get('entry'))})
因为来自 HTML 字段的字符串在 Python 中会变成 Unicode 文本,所以在后端,我们显然需要把它转换成 Python 字符串(因为 getJSON()
似乎不喜欢 Python 的 Unicode 字符串表示——有人知道这是为什么吗?)。
总之,原来的问题已经解决了。最后总结一下:任何包含 Python Unicode 字符串的 JSON 对象将 不会 被接受为有效的 JSON 对象,并且会悄悄失败——这是一个很棘手的问题,我可以想象在服务器端用 Python 和 JQuery 的人会遇到这个麻烦。