我在我的MooTools脚本中运行一个AJAX调用,这在Firefox中工作得很好,但在Chrome中,我得到了一个未捕获的SyntaxError:意外令牌:错误,我不能确定为什么。注释掉代码来确定坏代码在哪里不会产生任何结果,我认为这可能是JSON返回的问题。检查控制台,我看到返回的JSON是这样的:
{"votes":47,"totalvotes":90}
我没有看到它有任何问题,为什么会出现这个错误?
vote.each(function(e){
e.set('send', {
onRequest : function(){
spinner.show();
},
onComplete : function(){
spinner.hide();
},
onSuccess : function(resp){
var j = JSON.decode(resp);
if (!j) return false;
var restaurant = e.getParent('.restaurant');
restaurant.getElements('.votes')[0].set('html', j.votes + " vote(s)");
$$('#restaurants .restaurant').pop().set('html', "Total Votes: " + j.totalvotes);
buildRestaurantGraphs();
}
});
e.addEvent('submit', function(e){
e.stop();
this.send();
});
});
如果没有任何意义,这个错误也可能是由嵌入在html/javascript中的PHP错误引起的,比如下面这个
<br />
<b>Deprecated</b>: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in <b>C:\Projects\rwp\demo\en\super\ge.php</b> on line <b>54</b><br />
var zNodes =[{ id:1, pId:0, name:"ACE", url: "/ace1.php", target:"_self", open:true}
不是PHP插入到html中的代码中的<br />等导致了错误。要修复这类错误(抑制警告),请在开始时使用此代码
error_reporting(E_ERROR | E_PARSE);
要查看,右键单击页面,“查看源代码”,然后检查完整的html以发现此错误。
听起来好像你的回答被评估了。这将在Chrome中给出相同的错误:
var resp = '{"votes":47,"totalvotes":90}';
eval(resp);
这是由于大括号的{…}被javascript解释为代码块,而不是人们可能期望的对象文字。
我会查看JSON.decode()函数,看看是否有一个eval在那里。
这里也有类似的问题:
Eval() =意外令牌:错误
当你请求JSON文件时,服务器返回JavaScript内容类型头(text/ JavaScript)而不是JSON (application/ JSON)。
根据MooTools文档:
带有javascript内容类型的响应将被自动评估。
结果MooTools试图评估你的JSON作为JavaScript,当你试图评估这样的JSON:
{"votes":47,"totalvotes":90}
作为JavaScript,解析器将{和}视为块作用域,而不是对象符号。它与求值以下“code”相同:
"votes":47,"totalvotes":90
如你所见,:在这里完全出乎意料。
解决方案是为JSON文件设置正确的Content-Type头。如果你用.json扩展名保存它,你的服务器应该自己做。
我刚刚解决了这个问题。有一些东西导致了标准请求调用的问题,所以这是我使用的代码:
vote.each(function(element){
element.addEvent('submit', function(e){
e.stop();
new Request.JSON({
url : e.target.action,
onRequest : function(){
spinner.show();
},
onComplete : function(){
spinner.hide();
},
onSuccess : function(resp){
var j = resp;
if (!j) return false;
var restaurant = element.getParent('.restaurant');
restaurant.getElements('.votes')[0].set('html', j.votes + " vote(s)");
$$('#restaurants .restaurant').pop().set('html', "Total Votes: " + j.totalvotes);
buildRestaurantGraphs();
}
}).send(this);
});
});
如果有人知道为什么标准请求对象给我的问题,我很想知道。