Javascript AjaxFileUpload语法错误:XML表达式中缺少}
我正在尝试使用$.ajaxFileUpload上载文件。我的服务器脚本正在返回一个json对象,例如 {“imgName”:“test.jpg”,“imgUrl”:“/uploadtest/images/profile/sam.jpg”} 当我签入firefox时,它会显示正确的响应。还接收到Json。但我仍然在警报中收到一个错误:Javascript AjaxFileUpload语法错误:XML表达式中缺少},javascript,ajax,Javascript,Ajax,我正在尝试使用$.ajaxFileUpload上载文件。我的服务器脚本正在返回一个json对象,例如 {“imgName”:“test.jpg”,“imgUrl”:“/uploadtest/images/profile/sam.jpg”} 当我签入firefox时,它会显示正确的响应。还接收到Json。但我仍然在警报中收到一个错误: SyntaxError: missing } in XML expression uploadHttpData: function( r, type ) {
SyntaxError: missing } in XML expression
uploadHttpData: function( r, type ) {
var data = !type;
var dataparsed = r.responseText.split("{"); //added by Jude
dataparsed = dataparsed[1].split("}"); //added by Jude
///Commented By Jude
///data = type == "xml" || data ? r.responseXML : r.responseText;
// If the type is "script", eval it in global context
data = type == "xml" || "{ " + dataparsed[0] + " }"; //added by Jude
if ( type == "script" )
jQuery.globalEval( data );
// Get the JavaScript object, if JSON is used.
if ( type == "json" ) {
eval( "data = " + data );
}
// evaluate scripts within html
if ( type == "html" )
jQuery("<div>").html(data).evalScripts();
//alert($('param', data).each(function(){alert($(this).attr('value'));}));
return data;
}
我不明白为什么会出现这个错误。
在firebug中,Json对象也正确显示
<script type='text/javascript' src='/js/ajaxfileupload.js'></script>
<script type='text/javascript'>
function doFileUpload(){
$("#loading")
.ajaxStart(function(){
$(this).show();
})
.ajaxComplete(function(){
$(this).hide();
});
$.ajaxFileUpload(
{
url:'/json/image/upload.html?action=saveImage&nameSpace=tot',
secureuri:false,
fileElementId:'imgFile',
dataType: 'json',
success: function (data, status){
alert("Success: "+data.imgUrl);
},
error: function (data, status, e){
alert("Error: "+e+"---URL: "+data.imgUrl);
}
}
)
}
</script>
函数doFileUpload(){
$(“#加载”)
.ajaxStart(函数(){
$(this.show();
})
.ajaxComplete(函数(){
$(this.hide();
});
$.ajaxFileUpload(
{
url:'/json/image/upload.html?action=saveImage&nameSpace=tot',
secureuri:false,
fileElementId:'imgFile',
数据类型:“json”,
成功:功能(数据、状态){
警报(“成功:+data.imgUrl”);
},
错误:功能(数据、状态、e){
警报(“错误:+e+”--URL:+data.imgUrl);
}
}
)
}
。。。。
上传图像:
上传
任何人都可以告诉我错误的原因是什么?我终于找到了问题。问题在于我正在使用的Jquery的AjaxFileUpload插件。数据类型中的“json”需要大写,而不是“json”。数据类型:“JSON”。此外,在修复此问题后,它会自动将和添加到接收到的json数据的开头和结尾。因此,它不是解释为ad-json
<pre>{"imgName": "test.jpg", "imgUrl": "/uploadtest/images/profile/sam.jpg"}</pre>
我收到的实际数据是
{“imgName”:“test.jpg”,“imgUrl”:“/uploadtest/images/profile/sam.jpg”}
现在我必须删除这些标记,然后用$.parseJson()解析它。
如果任何人有相同的错误,那么检查这些问题。
我希望ajaxFileUpload插件能很快修复。我发现Mozila中的返回数据导致了这个问题。实际上,返回的消息带有
消息,这是一个错误
我应用的修复方法是删除返回消息中不需要的任何内容,并且它可以正常工作。但我不确定这是否是一个永久的解决办法。在ajaxfileupload.js脚本文件的末尾,我修改了uploadHttData
函数
$Ex=end(explot('.', image));
uploadHttpData:函数(r,类型){
变量数据=!类型;
var dataparsed=r.responseText.split(“{”);//由Jude添加
dataparsed=dataparsed[1]。拆分(“}”);//由Jude添加
///裘德评论
///data=type==“xml”| | data?r.responseXML:r.responseText;
//如果类型为“脚本”,请在全局上下文中对其求值
data=type==“xml”| |“{”+dataparsed[0]+“}”;//由Jude添加
如果(类型==“脚本”)
globalEval(数据);
//如果使用JSON,则获取JavaScript对象。
如果(类型==“json”){
评估(“数据=”+数据);
}
//在html中评估脚本
如果(类型==“html”)
jQuery(“”.html(数据).evalscript();
//警报($('param',data).each(函数(){alert($(this.attr('value'));}));
返回数据;
}
要解决此问题,请确保将答案的内容类型设置为“text/html”
看起来确实很奇怪:-)
原因是Firefox会处理答案以生成文档。
当答案的内容类型为“text/plain”Firefox(仅显示html)时,通过添加标记将答案转换为html。如果您希望返回一维json响应,Jude Adeline答案是正确的。如果您希望从PHP返回多维数组,请将代码修改为以下内容
$tmp=explot('.', image);
$Ex=end($tmp);
uploadHttpData:函数(r,类型){
变量数据=!类型;
var dataparsed=r.responseText.substr(1);//已更改并添加
dataparsedLength=dataparsed.length;//已更改或添加
dataparsed=dataparsed.substr(0,dataparsedLength-1);//已更改并添加
data=type==“xml”| |“{”+dataparsed+“}”;//已更改或添加
//如果类型为“脚本”,请在全局上下文中对其求值
如果(类型==“脚本”)
globalEval(数据);
//如果使用JSON,则获取JavaScript对象。
如果(类型==“json”)
评估(“数据=”+数据);
//在html中评估脚本
如果(类型==“html”)
jQuery(“”.html(数据).evalscript();
返回数据;
}
我已经解决了这个问题-您只需更改一行即可
如果((type==“json”)|(type==“json”))在FireFox和IE中都可以正常工作,我遇到了这样的错误
我用过:
mixed end ( array &$array );
$fruits = array('apple', 'banana', 'cranberry');
echo end($fruits); // cranberry
在doajaxfileupload.php中,出现以下错误:
“AjaxFileUpload语法错误:XML表达式中缺少}”
我把它改成:
xml.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;
这对我有用
下表给出了以下示例:
我已经解决了这个问题
只需更新代码行:
if ( type == "json" )
{
// If you add mimetype in your response,
// you have to delete the '<pre></pre>' tag.
// The pre tag in Chrome has attribute, so have to use regex to remove
var data = r.responseText;
var rx = new RegExp("<pre.*?>(.*?)</pre>","i");
var am = rx.exec(data);
//this is the desired data extracted
var data = (am) ? am[1] : ""; //the only submatch or empty
eval( "data = " + data );
}
关于这一点:
innerHTML导致了问题。要从响应中重新格式化pre,可以使用regex(信用证:)
if(type==“json”)
{
//如果在响应中添加mimetype,
//您必须删除“”标记。
//Chrome中的pre标记具有属性,因此必须使用regex删除
var数据=r.responseText;
var rx=新的RegExp(“(*?”,“i”);
var am=rx.exec(数据);
//这是提取的所需数据
变量数据=(am)?am[1]:“”;//唯一的子匹配项或为空
评估(“数据=”+数据);
}
我通过在github中搜索ajaxfileupload找到了json问题的解决方案,并找到了适合我的这个版本。一旦我在Safari和Chrome上大写json,json数据返回将被包装在其中。还需要对数据进行认证。谢谢你的解决方案,Jude。对我来说有效的是使用Jquery eval(“data=”+$(data.text());(在最后一行)
xml.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;
xml.responseText = io.contentWindow.document.body?io.contentWindow.document.body.textContent:null;
if ( type == "json" )
{
// If you add mimetype in your response,
// you have to delete the '<pre></pre>' tag.
// The pre tag in Chrome has attribute, so have to use regex to remove
var data = r.responseText;
var rx = new RegExp("<pre.*?>(.*?)</pre>","i");
var am = rx.exec(data);
//this is the desired data extracted
var data = (am) ? am[1] : ""; //the only submatch or empty
eval( "data = " + data );
}