JQuery+Ajax, Success回调函数未能正常运作问题

最近一段时间研究Java Spring Boot框架,用Ajax实现了一个很简单的跨域请求。

后端控制器的写法如下所示:

@RestController
public class BookController {
    @GetMapping("/book")
    @ResponseBody
    public Book bookHandler(Book book){
        return book;
    }
}

后端用的JsonHttpMessageConverterFastJson。

前端代码如下所示:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Title</title>
    <script src="jquery.js"></script>
</head>
<body>
<div id="contentDiv"></div>
<input type="button" value="query" onclick="getData()">
<script>
    function getData(){
        $.ajax({
            url:'http://localhost:8080/book/',
            type:'get',
            
            dataType: "json",
            

            data:{name:'ddd',author:'dxt',id:2},
            success:function (msg){
                //错误写法↓
                $("#contentDiv").html(msg);
            }
        })
    }
</script>
</body>
</html>

错误现象是:点击"query"按钮之后,可以在控制台-NetWork栏中看到被接收的json串,但是页面没有反应。

错误原因是:由于Ajax配置中加上了dataType: "json",msg被从json串自动解析为字典类型对象,而字典传入$(..).html(...)函数时,页面上不会有任何回显,也不会有任何报错。

那如果把dataType: "json"去掉,会怎么样呢?回答是问题照旧:

首先Response头部包含了:“Content-Type: application/json”这一项,这一点从控制台或Postman能确认。

其次W3Cschool里提到:

....jQuery 将自动根据 HTTP 包 MIME 信息来智能判断....

因此,即使把 dataType: "json" 去掉,JQuery也会根据Response头将json串自动解析为字典类型对象。


遇到类似问题时,可以通过游览器-控制台对JQuery.js文件下断点来分析问题:

			if ( isSuccess ) {

				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
				if ( s.ifModified ) {
					modified = jqXHR.getResponseHeader( "Last-Modified" );
					if ( modified ) {
						jQuery.lastModified[ cacheURL ] = modified;
					}
					modified = jqXHR.getResponseHeader( "etag" );
					if ( modified ) {
						jQuery.etag[ cacheURL ] = modified;
					}
				}

				// if no content
				if ( status === 204 || s.type === "HEAD" ) {
					statusText = "nocontent";

				// if not modified
				} else if ( status === 304 ) {
					statusText = "notmodified";

				// If we have data, let's convert it
				} else {
					statusText = response.state;
					success = response.data;
					error = response.error;
					isSuccess = !error;
				}
			}

对这里的"success = response.data;"下断点,便可通过success变量的值,确认从服务器response中返回的数据是字符串还是已被自动转化为对象类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值