我在使用里面的代码后发现存在以下问题:

1.这种写法重写了jQuery中的$.ajax,如果说页面本身用了iframe的形式设计的话,内部的页面第一次加载使用此方法可以正常运行,但是第二次加载内部页面的话,可能会造成jQuery相关的函数失效(报undefined的错误)

2.ajax请求完成之后的操作(回调)直接写在了这个方法里面,如果下次对于请求完成后有新的操作,这个方法估计又得重写

考虑到以上的问题,我在参考了原始代码的基础上,使用jQuery进行了封装。封装代码如下:

pageRequest.js

/**
 * 监控页面所有ajax请求,如果处理完,则执行特定操作
 */

(function($){
	// 将$.ajax存放到window对象中
	var ajaxBack = window.ajaxBack||$.ajax;
	// 上面这种写法与window.ajaxBack?window.ajaxBack:$.ajax等效
	window.ajaxBack = ajaxBack;
	
	var PageRequest = function(pageRequest) {
		
		var _this_ = this;
		
		this.pageRequest = pageRequest;
		
		// 默认配置参数
		this.options = {
			// 请求成功后要做的操作
			success:initSeePage
		};
		
		// 如果传了options,则覆盖默认的options
		if(this.getOptions()){
			$.extend(this.options, this.getOptions());
		}
		
		// 保存配置参数
		var options = this.options;
		
		// 当sucess不为空时,执行函数
		if(options.success) {
			_this_.invoke(options);
		}
	};
	
	PageRequest.prototype = {
		// 获取配置参数
		getOptions:function() {
			// 拿到初始化时传入的参数
			var pageRequest = this.pageRequest;
			
			// 确保有配置参数
			if(pageRequest) {
				return pageRequest;
			} else {
				return null;
			}
		},
		
		// 事件驱动函数
		invoke:function(options) {
			//前提:所有ajax请求都是用jquery的$.ajax发起的,而非原生的XHR;
		    // var ajaxBack = $.ajax;
		    var ajaxCount = 0;
		    var allAjaxDone = function(){
		    	options.success();
		    } //一行代码,就可以知道所有ajax请求什么时候结束
		    
		    //由于get/post/getJSON等,最后还是调用到ajax,因此只要改ajax函数即可
		    $.ajax = function(setting){
		      ajaxCount++;
		      var cb = setting.complete;
		      setting.complete = function(){
		        if($.isFunction(cb)){cb.apply(setting.context, arguments);}
		        ajaxCount--;
		        if(ajaxCount==0 && $.isFunction(allAjaxDone)){
		          allAjaxDone();
		          $.ajax = ajaxBack; // 将$.ajax恢复成原来的jquery对象
		        }
		      }
		      ajaxBack(setting);
		    }
		}
	}
	
	PageRequest.init = function(pageRequest) {
		var _this_ = this;
		new _this_(pageRequest);
	}
	
	window.PageRequest = PageRequest;
	
	// 初始化查看页面
	function initSeePage() {
		// 将页面上的按钮禁用
		$("input[type=button]").attr("class", "disabled_button")
		$("select").attr("disabled", "disabled");
		$("textarea").attr("disabled", "disabled");
		$("input").each(function(i) {
			if ($(this).is(":visible")) {
				$(this).attr("disabled", "disabled");
			}
		});
		$("img").attr("onclick", "");
		$("img").unbind("click");
		
		$("div").attr("onclick", "");
		$("div").unbind("click");
		
		var images = document.getElementsByTagName("img");
		for ( var i = 0; i < images.length; i++) {
			try {
				images[i].removeEventListener("onclick", function() {
				});
			} catch (e) {
				images[i].attachEvent("onclick", function() {
				});
			}
		}
	}
	
})(jQuery);

使用方法如下:

1.不传入参数的情况下,ajax所有请求完成后,会执行initSeePage方法(该方法将页面上的所有按钮等元素禁用,及相关的click事件解除)

<script type="text/javascript">
	// 在点击查询后,页面所有ajax请求完成后,禁用掉页面元素
	$(document).ready(function() {
		var initPage = function() {
			PageRequest.init()
		};
		$("#searchBtn").click();
		initPage();
	});
</script>

2.如果想要在页面点击查询按钮后,所有除查询以外的元素被禁用,但是再次点击查询,依然仍维持这种效果,可以这样写

(注:这里传入了自定义操作,该操作替换了默认的initSeePage方法)

<script type="text/javascript">
	// 在点击查询后,页面所有ajax请求完成后,禁用掉页面元素
	$(document).ready(function() {
		var initPage = function() {
			PageRequest.init({
				"success":myOperation
			})
		};
		$("#searchBtn").on("click", initPage).click();
		initPage();
	});
</script>

// 自定义操作
function myOperation() {
	$("input").each(function(i) {
		if ($(this).is(":visible")) {
			var butValue=$(this).attr("value");
			if(butValue=="新增"||butValue=="编辑"||butValue=="删除"||butValue=="添加"||butValue=="保存"){
				$(this).attr("class", "disabled_button");
				$(this).attr("disabled", "disabled");
			}
		}
	});
}