javascript - 拦截 XMLHttpRequest 并修改 responseText

标签 javascript ajax xmlhttprequest

我正在尝试构建一个脚本,该脚本将充当 native XMLHttpRequest 对象的代理/包装器,使我能够拦截它、修改 responseText 并返回到原始 onreadystatechange 事件。

上下文是,如果应用程序尝试接收的数据已在本地存储中可用,则中止 XMLHttpRequest 并将本地存储的数据传回应用程序的成功/失败回调方法。假设我无法控制应用程序现有的 AJAX 回调方法。

我最初尝试过以下想法..

var send = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(data){
   //Do some stuff in here to modify the responseText
   send.call(this, data);
};

但正如我现在确定的那样,responseText 是只读的。

然后我尝试退后一步,将我自己的完整 native 代理编写到 XMLHttpRequest,最终编写了我自己版本的 native 方法。类似于这里讨论的...

http://www.ilinsky.com/articles/XMLHttpRequest/#implementation-wrapping

但它很快变得困惑,并且仍然难以将修改后的数据返回到原始的 onReadyStateChange 方法。

有什么建议吗?这可能吗?

最佳答案

//
// firefox, ie8+ 
//
var accessor = Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, 'responseText');

Object.defineProperty(XMLHttpRequest.prototype, 'responseText', {
	get: function() {
		console.log('get responseText');
		return accessor.get.call(this);
	},
	set: function(str) {
		console.log('set responseText: %s', str);
		//return accessor.set.call(this, str);
	},
	configurable: true
});


//
// chrome, safari (accessor == null)
//
var rawOpen = XMLHttpRequest.prototype.open;

XMLHttpRequest.prototype.open = function() {
	if (!this._hooked) {
		this._hooked = true;
		setupHook(this);
	}
	rawOpen.apply(this, arguments);
}

function setupHook(xhr) {
	function getter() {
		console.log('get responseText');

		delete xhr.responseText;
		var ret = xhr.responseText;
		setup();
		return ret;
	}

	function setter(str) {
		console.log('set responseText: %s', str);
	}

	function setup() {
		Object.defineProperty(xhr, 'responseText', {
			get: getter,
			set: setter,
			configurable: true
		});
	}
	setup();
}

关于javascript - 拦截 XMLHttpRequest 并修改 responseText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16959359/

相关文章:

javascript - Javascript new FormData 和带有 (form).serializeArray() 的 HTML 表单之间的区别?

javascript - 从次要单位格式化多种货币而不存储比率

javascript - 在我的 Nodejs 项目中编辑产品时出现问题

javascript - 重新加载后保存状态 flex 菜单

php - 向客户端发送 PHP 错误的正确机制

javascript - XMLHTTPRequest 错误 : Synchronous XMLHttpRequest on the main thread is deprecated . ..(SoundCloud API)

javascript - 从数组中选择仅显示一次的图像

javascript - 在 angularJS 中调用 ajax 后更改 View

javascript - 如何在一个同步块(synchronized block)中异步执行多个ajax调用(jquery)

javascript - XMLHttpRequest 未发送 'Via'