我通过更改XMLHttpRequest.prototype
open
和send
方法拦截了我网站中的AJAX请求。这种方法在我测试的所有浏览器中都没有任何麻烦。然而,当谈到Chrome for iOS(iPhone)时,代码有一个最怪异的错误:它就像它不断激发我在原型中改变的代码(显然最终会崩溃)。
这是我正在做的一个超级极小的例子:
var open = XMLHttpRequest.prototype.open; // Caching the original
XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
alert('open'); // Here is my code
open.call(this, method, url, async, user, pass); // Calling the original
};
我已经组建了一个小的JSBin,只是你可以在iOS上访问你的Chrome: Demo
根据this回答,我正在使用的代码(与该答案中的一个OP基本相同)是安全的,应该没有理由担心。而且,事实上,Chrome for iOS是唯一表现奇怪的浏览器。
这让我疯了两天,任何建议或解决方法都表示赞赏。
答案 0 :(得分:3)
这是适用于大多数浏览器的XMLHttpRequest拦截代码:
(function(open) {
XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
// Intercept the open request here
alert("Intercepted: " + url);
open.apply(this, arguments);
};
})(XMLHttpRequest.prototype.open);
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET","http://google.com",true);
xmlhttp.send();
Chrome for iOS存在问题。它已在下面提出并进行了调查。我将为重复的open()
电话"提供解释。错误,演示和解决方法。
从上一篇文章:
在页面加载时,Chrome会向服务发出两个异步请求 它可能是在本地运行。通过URL的声音 请求,这些服务用于确保页面的安全性 你正在访问。
以下是Chrome正在尝试访问的一个此类本地网址的屏幕截图(Demo):
Chrome会定期对其XMLHttpRequest.open()
进行调用。这些对拦截代码的重复调用不是由拦截代码本身引起的;它们是由Chrome浏览器中无关且重复的电话引起的。我已经确定了两个这样的网址。可能还有其他人。
根据我的研究,此解决方法使Chrome for iOS上的XMLHttpRequest代码拦截工作。请参阅此JSBin测试演示。它将演示如何这些重复的调用。从本质上讲,拦截代码应该忽略Chrome使用的URL。
(function(open) {
XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
var d1 = document.getElementById('urls');
// Avoid intercepting Chrome on iOS local security check urls
if(url.indexOf("/chromecheckurl") < 0 && url.indexOf("/chrome") !== 0) {
// These are what we want to intercept
d1.insertAdjacentHTML('beforeend', '<b>'+url+'</b><br/>');
} else {
// These are the internal Chrome requests - we can ignore them
d1.insertAdjacentHTML('beforeend', '<i>'+url+'</i><br/>');
}
open.apply(this, arguments);
};
})(XMLHttpRequest.prototype.open);
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET","http://google.com",true);
xmlhttp.send();
这是我尝试解释此问题的最佳尝试&#34;重复open()
来电&#34; Chrome for iOS上的错误以及解决方法。