所以我使用ajax将序列化表单发布到php脚本,然后成功提醒返回的数据。 我的代码在我的本地环境中运行正常,但是上传了,eval()函数可以解决所有问题。
这是我的代码:
function post_that_shit(formIdToSerialize, postUrl) {
var serializedData = $("#"+formIdToSerialize).serialize();
var post_url = postUrl+".php";
//alert(serializedData + "\n" + post_url);
$.ajax({
url: post_url,
type: "POST",
data: serializedData,
success: function(data){
data = eval('('+data+')' );
console.log(data.msg);
if(data.reload == 'yes'){
window.location.reload();
}
if(data.relocate != 'no'){
window.location.href = data.relocate;
//alert(data.relocate);
}
if(data.msg != 'no'){
$(".message").html(data.msg);
//alert(data.msg);
}
//alert('relocate: '+data.relocate);
}
});
}
所以很简单。 php回显出一个json编码的数组,如下所示:
echo json_encode(array('msg' => $errors, 'relocate' => 'no'));
根据回显的内容,显示消息或用户重新定位。
为什么我在线使用代码时会收到SyntaxError:Unexpected token')'的错误? 在当地它工作得很好:(
Thanx求助
克里斯
答案 0 :(得分:3)
您无需使用eval()
。只需将dataType
选项设置为'json'
,数据将通过jQuery在内部解析为对象
$.ajax({
url: post_url,
type: "POST",
dataType:'json',
data: serializedData,
success: function(data){
console.log(typeof data); // returns "object"
此外,在服务器上为application/json
设置正确的内容类型标题也有帮助
答案 1 :(得分:2)
我不知道为什么你需要那个地方的eval()
功能。这是一个错误的编码。您的解决方案是将数据类型设置为JSON,而ajax函数会自动将其视为json:
$.ajax({
url: post_url,
type: "POST",
dataType: 'json',
data: serializedData,
success: function(data){
console.log(data.msg);
if(data.reload == 'yes'){
window.location.reload();
}
if(data.relocate != 'no'){
window.location.href = data.relocate;
//alert(data.relocate);
}
if(data.msg != 'no'){
$(".message").html(data.msg);
//alert(data.msg);
}
//alert('relocate: '+data.relocate);
}
});
答案 2 :(得分:1)
首先,eval
是邪恶的。不要使用它......永远不要!这就像炸弹准备爆炸一样。
其次,解析json可以在Javascript中本地完成。无需eval
。
您可以使用JSON.parse
,它将返回一个由包含json文本的字符串解析的对象。
eval
用于评估代码,换句话说,它正在执行javascript而不是json。当eval
返回一个对象时,它只是JSON作为JavaScript子集的副作用。换句话说,任何格式化为json的字符串都可以评估为JavaScript。但JavaScript无法格式化为JSON。没有Date
,Function
和更复杂对象的表示。也就是说,当使用eval
时,你实际上是在执行JavaScript,这就是问题所在。它可以执行具有潜在危险的代码,而解析JSON只需要将数据解析为数据结构而不再需要。
有关JSON的更多信息:https://fr.wikipedia.org/wiki/JavaScript_Object_Notation
因此,它允许任何人添加一些javascript,然后通过使用eval
执行。它可以允许某人在其他用户的浏览器上执行代码。它可以用来窃取密码,例如窃取任何其他无法访问的私人信息。
dataType
属性作为'json'来本地解析json。像这样:
$.ajax({
url: post_url,
type: "POST",
dataType: 'json',
data: serializedData,
success: function(data){
console.log(data.msg);
或使用JSON.parse
$.ajax({
url: post_url,
type: "POST",
data: serializedData,
success: function(data){
data = JSON.parse(data)
console.log(data.msg);
同样正如charlie
指出的那样,我们自己解析JSON意味着我们必须将它包装在try catch
中,因为如果json无效,解析可能会失败。
但是使用jQuery为我们提供了一种轻松处理它的方法。
你可以重写你的代码:
var req = $.ajax({
url: post_url,
type: "POST",
dataType: 'json',
data: serializedDate
});
req.done(function (data) {
// Success
});
req.fail(function () {
// Error something went wrong
});
使用promise表单的优点是你可以链接调用以获得干净的异步代码,而不是回调地狱和无限函数嵌套。