1、完成了原生xhr的formdata传参。之前的错误问题是图片上传接口不对。
坑1:任务资源里面的,新增acticle接口中字段img的键值,是需要单独引用上传图片接口的反馈图片服务器地址。
坑2:返回信息数组格式不能直接使用,需要使用eval()转换。
函数部分为“上传”按钮执行。端口参照“上传图片”。
var xhr = new XMLHttpRequest();
xhr.open("POST", "/carrots-admin-ajax/a/u/img/task"); //上传图片接口
xhr.send(formdata); //只传入图片信息
xhr.onreadystatechange=function(){
if (this.readyState===4 && this.status===200)
{
if (this.responseText)
{
console.log(this.responseText); //打印返回信息
img= eval("(" + this.responseText + ")").data.url; //转换
console.log(img)
2、查看了eval的参数说明:
在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式:使用eval()函数、使用Function对象来进行返回解析。
使用eval函数来解析,并且使用jquery的each方法来遍历
用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject等插件封装的JSON对象,与此亦是大同小异,这里不再做说明。
这里首先给出JSON字符串集,字符串集如下:
var data="
{ root: [ {name:'1',value:'0'}, {name:'6101',value:'北京市'}, {name:'6102',value:'天津市'}, 。。。]}";
这里以jquery异步获取的数据类型——json对象和字符串为依据,分别介绍两种方式获取到的结果处理方式。
1.对于服务器返回的JSON字符串,如果jquery异步请求没做类型说明,或者以字符串方式接受,那么需要做一次对象化处理,方式不是太麻烦,就是将该字符串放于eval()中执行一次。这种方式也适合以普通javascipt方式获取json对象,以下举例说明:
var dataObj=eval("("+data+")");//转换为json对象
为什么要 eval这里要添加 “("("+data+")");//”呢?
原因在于:eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。
加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。所以下面两个执行结果是不同的:
alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]
对于这种写法,在JS中,可以到处看到。
收获:完整上传成功后,回来再看整个流程,任务逻辑终于清晰。还有原生表单发送数据基本算是掌握。
困难:看了angular的$http传参资料,发现方法好像挺多的。另外任务9/10好像都没有明确说,需要做到什么程度,上下线、编辑、删除功能需要加进去吗,还是在任务10 的时候一起弄?
计划:继续任务9。
评论