国产什么手机女士suv销量排行榜第一名

ajax无法执行success回调的原因分析
在项目中WEB前端使用了ajax方式访问服务端的数据,一直访问的好好的代码,却突然不能执行success回调了,却执行了error回调,在确认了url是正常的,并直接在里访问url,也返回了正确的JSON数据的情况下,请教了高手帮我解决这个问题。
CreateLogMapFromTmpl = function(tmplId) {url = "/service/welllogtmpl/" + tmplId;$.ajax({type:'GET',url:url,cache:false,success:function(msg){ result = JSON.parse(msg);if(result.code == "200"){alert(result.response);}},error: function(e) { alert(e); } });}
2.原因分析
在使用ajax访问数据的时候,浏览器会对返回值进行判断,其判断的依据就是请求头的ContentType,于是查看了服务端,有如下代码
response.setContentType("text/ charset=UTF-8");
也就是说服务端把返回内容指定成了javascript,那么浏览器就根据服务端指定的ContentType对页面返回信息进行判断,当然会认为返回了错误的信息,因为返回的内容是JSON,肯定不符合Script的语法,于是就执行了error回调。
3.解决方案
经过分析,找到了原因,那么解决起来当然很容易了,只需要把服务端指定ContentType的代码去掉就行了,其默认类型是 text/plain ,就是告诉浏览器,返回的内容是普通的文本,就不用检查啦!!!
于是这个小小的问题就解决了。
4.如何直接返回JSON对象
很显然在客户端要使用JSON.parse来解析返回的普通文本,也是一项开销,那么有没有办法让浏览器直接返回JSON对象呢?答案是肯定的。
只需要在服务端指定ContentType为json就行了,代码如下:
response.setContentType("text/ charset=UTF-8");
在客户端就不用再解析了,可以直接得到JSON对象,代码如下:
CreateLogMapFromTmpl = function(tmplId)
url = "/service/welllogtmpl/" + tmplId;
type:'GET',
cache:false,
success:function(result){
//result = JSON.parse(msg);
if(result.code == "200")
alert(result.response);
error: function(e) {
5.其他问题
在解决这个问题过程中,还发现了另一个文章,其问题主要是jquery版本对JSON的格式严格限制程度不一样造成的,但现象和本文中提到的现象一样。
详细内容可以打开以下链接:
http://www.jb51.net/article/32540.htmjquery&ajax&success&函数&异步调用方法中不能给全局变量赋值的原因及解决办法
在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们发现程序执行完后并没有获取到我们想要的值,这时很有可能是因为你用的是ajax的异步调用async:true(默认情况),如:
function ManageCommentText(text) {
&&& var result =
data: "get",
url: "GetComments.aspx",
data: "type=getText&commentText=" + text,
cache: false,
async: false,
success: function (data) {
&&&&&&&&&&&
&&& return
以上方法是ajax的同步调用,只有在获取到了data值并赋值给result以后才会返回result完成该方法的调用。若设为async:true,
则会未等到获取data值就已经返回了result。
另一个解决办法就是将你的代码直接写到success方法里。(根据你的业务并不是所有的都可以直接写到success里的)。
注意:如果设定为& async:
false,就失去 ajax异步的优点了哦。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。jquery中ajax如何返回值到上层函数的方法以及对于js处理json对象方法的记录
①在我们做前端js处理的时候我们经常会将一些公用的js方法封装起来,方便别的地方调用,但是我们要做的是需要将请求返回的值传递给调用者,这里我记录了在js中采用ajax方法获取后台数据并返回给调用者的方法,我们平时使用ajax的方法基本为如:
function AutoGetOpenid(){
var personJ
url : &***.action&,
type : 'post',
dataType : 'json',
contentType : &application/x-www-form- charset=utf-8&,
'code' : location.href.split('=')[1].split('&')[0]
success : function(data) {
//返回获取到用户的信息,昵称、城市、openid、unionid、性别、头像地址等、、
personJson = jQuery.parseJSON(data);
error : function() {
return personJ
但是返回获取到的personJson却是没有我们想要的值,其实追究其原因是因为ajax中存在同步执行和异步执行的两种方式,在不做任何抉择的时候ajax采用的是异步执行的方式,所以我们想将结果返回的时候我们需要将执行方式修改为同步执行即可:
function AutoGetOpenid(){
var personJ
url : &***.action&,
type : 'post',
dataType : 'json',
contentType : &application/x-www-form- charset=utf-8&,
async:false,
'code' : location.href.split('=')[1].split('&')[0]
success : function(data) {
//返回获取到用户的信息,昵称、城市、openid、unionid、性别、头像地址等、、
error : function() {
return personJ
看上面代码的红色部分,只需要加上这一行代码就可以解决问题了;
②在①中我们获取到了返回值data,这是一个jsonobject的json对象,我们如何获取其中的属性对应的值呢?
personJson = jQuery.parseJSON(data);
alert(personJson.openid);
首先将数据对象话,然后通过object.key就可以获取到对象的属性值了 !
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'8046人阅读
【项目经验】(21)
【Web】(8)
& & & &调试代码遇到一个问题,就是前台执行删除操作后,controller返回数据,但前台接收时,ajax不执行success回调,总是弹出失败的对话框.接收数据类型是json.
先看看我的前台代码.
if (rows) {
$.messager.confirm('警告', '确定删除吗?', function(r) {
type : 'post',
url : 'deleteStudentTeachClass',
&ids& : ids
dataType : 'json',
traditional : true,
success : function(result) {
$.messager.alert(&提示&, &恭喜您,删除成功&, &info&);
$(&#dg&).datagrid(&reload&);
error : function(msg) {
$.messager.alert(&提示&, &操作失败&, &info&);
$(&#dg&).datagrid(&reload&);
下面是后台controller代码
@RequestMapping(value = &/deleteStudentTeachClass&)
public void deleteStudentTeachClass(String ids, HttpServletRequest request,
HttpServletResponse response) throws Exception {
String dataBaseName = &itoo_platform&;
String[] strArray =
strArray = ids.split(&,&);
Boolean flag =
String result = &false&;
flag = schoolTeachingBean.deleteStudentTeachClass(strArray,
dataBaseName);
if (flag == true) {
result = &success&;
} catch (RuntimeException e) {
e.printStackTrace();
outToJson.outJson(response, result);
& & & & &通过查询发现dataType如下的说明:&
& & & & &&json&: Evaluates the response as JSON and returns a JavaScript object. In jQuery 1.4 the JSON data is parse any malformed JSON is rejected and a parse error is thrown. (See json.org for more information on proper JSON formatting.)&
& & & & 也就是说jquery1.4版本以后对json格 式要求非常严格,要满足json.org网站定义的格式才能执行success回调,否则都会出错,无法解析返回的json数据.我看了下返回到前台的字符串,的确不是严格的json格式.
于是把后台返回值改成了这样:
if (flag == true) {
result = &{\&result\&:true}&;
但无论返回true还是false都执行success回调,这让我更郁闷.百思不得其解.
最终把前台判断改成了这样:
if (rows) {
$.messager.confirm('警告', '确定删除吗?', function(r) {
type : 'post',
url : 'deleteStudentTeachClass',
&ids& : ids
dataType : 'text',
traditional : true,
success : function(result) {
if(result=='true'){
$.messager.alert(&提示&, &恭喜您,删除成功&, &info&);
$(&#dg&).datagrid(&reload&);
$.messager.alert(&提示&, &操作失败&, &info&);
$(&#dg&).datagrid(&reload&);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:326261次
积分:9906
积分:9906
排名:第1483名
原创:176篇
评论:3394条
阅读:5965
阅读:43394
阅读:20014
(4)(4)(5)(4)(4)(5)(6)(1)(4)(3)(4)(3)(4)(4)(4)(4)(2)(4)(2)(5)(3)(3)(5)(4)(3)(3)(5)(2)(5)(4)(5)(4)(3)(2)(4)(4)(4)(2)(7)(4)(4)(4)(4)(4)(4)(2)(1)(3)如下javascript代码当使用
var devtypelist = DevTypeList(1);
进行调用的时候,devtypelist返回总是函数定义:
define(function(require,exports,module){
exports.DevTypeList = function(id){
var url = "/device/get/devtype/" +
$.getJSON(url,function(result){
该问题被发起重新开启投票
投票剩余时间:
之前被关闭原因:
该问题被发起删除投票
投票剩余时间:
距离悬赏到期还有:
参与关闭投票者:
关闭原因:
该问题已经被锁定
锁定原因:()
保护原因:避免来自新用户不合宜或无意义的致谢、跟帖答案。
该问题已成功删除,仅对您可见,其他人不能够查看。
默认情况下jQuery的Ajax调用是异步的,就是async:true。这个时候,你的代码先运行$.getJSON,然后直接就到了return data,所以外围接收到的就是undefined了。而URL调用成功之后的数据实际上是会走到你的回调函数的。
如果要想同步的调用URL,请使用$.ajax,设定async为true
var retV$.ajax({
url: your_url,
async: true,
type: "get",
dataType: "json",
success: function(data) {
// get the return value from the response and set it to retVal
}});return retV
由于ajax为异步调用,所以很少能直接拿到ajax的返回值。但有时候由于业务需要还必须要通过ajax来拿,那么我这里提供两种方案。具体方法:1、就像YODA写的那样 ,通过设置async:true让其异步变同步;2、可以将接下来需要使用到devtypelist参数的代码在你success之内执行。这两种方案,你根据你项目的具体实际选择一个。使用第一种相对来讲,假如你对性能要求不是太大可以选择。
除了和的办法, 还有两种方式:
放到jquery.ajax()方法返回的jqXHR对象的done()方法中, 象这样:
var a=$.ajax("http://www.");...a.done(function(){console.log("done with that")});
好处是代码更灵活一些.
设置标志位, ajax里的success()设置标志位, 外部程序轮询标志位.
德问是一个专业的编程问答社区,请
后再提交答案
关注该问题的人
共被浏览 (15531) 次

我要回帖

更多关于 女士suv销量排行榜 的文章

 

随机推荐