ajax的status为201依然触发jquery的error事件的问题

昨天在调试一个ajax的时候发现,即使status是201,仍然会触发jquery的error事件。statusText是"parseerror".

通过在stackoverflow上查询,戳这里

加上参数

dataType:"text"

就可以解决。

而问题产生的原因在评论里写的也很详细。但是并不对,他弄错了convert的位置,在jquery判断状态码前,就已经进行了ajaxConvert。

 // Determine if successful,判断status的大小
        isSuccess = status >= 200 && status < 300 || status === 304;

        // Get response data
        if (responses) {
            response = ajaxHandleResponses(s, jqXHR, responses);
        }

        // Convert no matter what (that way responseXXX fields are always set),在此处对response的data进行转化。下面附有ajaxConvert的源码。
        response = ajaxConvert(s, response, jqXHR, isSuccess);

        // If successful, handle type chaining
        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,判断状态是否为304
            } 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;
            }
        } else {
            // Extract error from statusText and normalize for non-aborts
            error = statusText;
            if (status || !statusText) {
                statusText = "error";
                if (status < 0) {
                    status = 0;
                }
            }
        }
function ajaxConvert( s, response, jqXHR, isSuccess ) {
	var conv2, current, conv, tmp, prev,
		converters = {},

		// Work with a copy of dataTypes in case we need to modify it for conversion
		dataTypes = s.dataTypes.slice();

	// Create converters map with lowercased keys
	if ( dataTypes[ 1 ] ) {
		for ( conv in s.converters ) {
			converters[ conv.toLowerCase() ] = s.converters[ conv ];
		}
	}

	current = dataTypes.shift();

	// Convert to each sequential dataType
	while ( current ) {

		if ( s.responseFields[ current ] ) {
			jqXHR[ s.responseFields[ current ] ] = response;
		}

		// Apply the dataFilter if provided
		if ( !prev && isSuccess && s.dataFilter ) {
			response = s.dataFilter( response, s.dataType );
		}

		prev = current;
		current = dataTypes.shift();

		if ( current ) {

			// There‘s only work to do if current dataType is non-auto
			if ( current === "*" ) {

				current = prev;

			// Convert response if prev dataType is non-auto and differs from current
			} else if ( prev !== "*" && prev !== current ) {

				// Seek a direct converter
				conv = converters[ prev + " " + current ] || converters[ "* " + current ];

				// If none found, seek a pair
				if ( !conv ) {
					for ( conv2 in converters ) {

						// If conv2 outputs current
						tmp = conv2.split( " " );
						if ( tmp[ 1 ] === current ) {

							// If prev can be converted to accepted input
							conv = converters[ prev + " " + tmp[ 0 ] ] ||
								converters[ "* " + tmp[ 0 ] ];
							if ( conv ) {

								// Condense equivalence converters
								if ( conv === true ) {
									conv = converters[ conv2 ];

								// Otherwise, insert the intermediate dataType
								} else if ( converters[ conv2 ] !== true ) {
									current = tmp[ 0 ];
									dataTypes.unshift( tmp[ 1 ] );
								}
								break;
							}
						}
					}
				}

				// Apply converter (if not an equivalence)
				if ( conv !== true ) {

					// Unless errors are allowed to bubble, catch and return them
					if ( conv && s.throws ) {
						response = conv( response );
					} else {
						try {
							response = conv( response );
						} catch ( e ) {
							return {
								state: "parsererror",
								error: conv ? e : "No conversion from " + prev + " to " + current
							};
						}
					}
				}
			}
		}
	}

	return { state: "success", data: response };
}

p.s.在ajax的同步请求情况下,onreadystatechang事件没有触发。

p.s.jquery判断了状态204(返回空),或304(用户使用缓存文档)。

注释:

· 204 - No Content 没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。

· 304 - Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

时间: 2024-12-20 21:21:04

ajax的status为201依然触发jquery的error事件的问题的相关文章

ajax请求成功返回200,但还是进入error事件

ajax请求成功返回200,但还是进入error事件. 出错原因: 前台dataType:"json",而后台返回的数据不符合json规范. 解决方案有两种: 1.前台:让ajax数据返回类型为text而不是json:即dataType: "text"; 2.后台:修改后台返回值 原文地址:https://www.cnblogs.com/Fourteen-Y/p/11307392.html

1、AJAX里面status的值代表什么 2、get post 的区别 3、怎样把对象转化成字符串 4、闭包、继承、原型、原型链 5 、http传输协议 6、arguments是什么

1.AJAX里面status的值代表什么     在JavaScript里面写AJax的时,最关键的一步是对XMLHttpRequest对象建立监听,即使用"onreadystatechange"方法.监听的时候,要对XMLHttpRequest对象的请求状态进行判断,通常是判断readyState的值为4且status的值为200或者304时执行我们需要的操作.以下记录了一些常用readState以及status的值及其含义 readyState 属性表示Ajax请求的当前状态.它的

jquery绑定的事件对ajax刷新出的数据不生效,on可能受jquery版本影响

问题:jquery绑定的事件对ajax刷新出的数据不生效 方法:可以用 jquery 里面的 on 和  delegate 预绑定父元素就可以触发的. 注意:某些限制下,个人用的是jquery 1.4.2版本,还不能更新到 1.7版本,on 绑定是报错的,用 delegate 可以的. on对jquery 看网上资料是需要 1.7以后版本才支持,具体没试验. 案例: 搜索新数据,调用choic.php 将key传过去获取搜索内容返回到arcz里面.将 arcz 里面新刷新出来的选中的 复选框 一

jquery的自定义事件通过on绑定trigger触发

jquery绑定自定义事件,可以实现预先绑定好一个处理方法,当需要使用的时候利用jquery trigger来触发自定义事件,以达到方便快捷的目的.我们来假设一个这样的场景,一个textarea中的字数计算,如果是直接键盘输入或者粘贴进来的话,是可以使用input方法检测到,但是如果是通过js插入的文本,这个时候input事件就监测不到了,这个时候如果我们事先给绑定一个myChange事件,它的回调函数就是来处理计算其中的文本字数的,我们在使用js给这个textarea赋值以后,连缀写上.tri

click事件多次触发 jQuery

jQuery 中 click事件会累计绑定 例如下列代码: aNode.click(function(){ bNode.click(function(){ console.log('haha'); }); }); 如果把对bNode的点击事件绑定到aNode的点击事件里,那么每点击一次aNode就会绑定一次bNode,假设在点击bNode之前点击了3次aNode,那么点击bNode之后,控制台会出现三次haha. 因为jQuery中的click事件会累计绑定 为了避免上述情况发生,应该避免把cl

jQuery Ajax 请求报长度过长的错误:Error during serialization or deserialization using the JSON JavaScriptSerializer

{"Message":"Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set 在web项目的web.config <configuration>节下增加 <system.web.extensions>    <scripting>    

解决jQuery中dbclick事件触发两次click事件

首先感谢这位小哥!http://qubernet.blog.163.com/blog/static/1779472842011101505853216/ 太长姿势了. 在jQuery事件绑定中,dbclick可以触发两次click事件.例如一个DOM元素div,既绑定了 click 事件,又绑定了 dblclick 事件,这两个事件分别要做独立的事情.事件处理上没有冲突,都可以各自完成各自的操作.双击的时候虽然是执行了 dblclick 事件,但是在这之前,也执行了click 事件,那么,如何来

ajax异步参数详解及alax错误信息error分析

一.$.ajax()的参数列表 ↑ 下面是Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求方式 ("POST" 或 "GET"), 默认为 "GET".注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持. timeout Number 设置请求超时时间(毫秒).

锋利的jQuery读书笔记---jQuery中的事件

jQuery中的事件: 1.加载DOM:注意window.onload和$(document).ready()的不同 2.事件绑定 3.合成事件 --2和3的详细信息见代码- <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <script type="text/javascript" src="../../