Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Chrome for iOS上拦截AJAX请求?_Javascript_Ios_Ajax_Chrome Ios - Fatal编程技术网

Javascript 在Chrome for iOS上拦截AJAX请求?

Javascript 在Chrome for iOS上拦截AJAX请求?,javascript,ios,ajax,chrome-ios,Javascript,Ios,Ajax,Chrome Ios,我通过改变XMLHttpRequest.prototypeopen和send方法在我的站点中拦截AJAX请求。这种方法在我测试的所有浏览器中都能正常工作。然而,当涉及到Chrome for iOS(iPhone)时,代码有一个最奇怪的错误:它就像我在原型机中更改的代码一样不断地被触发(显然,最终崩溃了) 下面是我正在做的一个非常简单的例子: var open = XMLHttpRequest.prototype.open; // Caching the original XMLHttpReque

我通过改变
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进行访问:

根据答案,我正在使用的代码(基本上与答案中的一个OP相同)是安全的,应该没有理由担心。事实上,Chrome for iOS是唯一一款行为怪异的浏览器

这两天让我抓狂,任何建议或解决方法都值得赞赏。

如何在Chrome for iOS上拦截AJAX请求 这是适用于大多数浏览器的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的iOS版存在一个问题。下文提出并调查了这一问题。我将解释“重复
open()
calls”错误、演示和解决方法

根据上次参考:

在页面加载时,Chrome向以下服务发出两个异步请求: 它大概是在本地运行的。从URL的声音来看,它是 请求时,这些服务用于确保页面的安全 您正在访问

下面是Chrome试图访问的一个本地URL()的屏幕截图:

Chrome自己定期调用
XMLHttpRequest.open()
。这些对拦截代码的重复调用不是由拦截代码本身引起的;它们是由来自Chrome浏览器的不相关和重复调用引起的。我已经确定了两个这样的URL。可能还有其他人

  • /色度安全/b86。。。98d/
根据我的研究,这种解决方法使得XMLHttpRequest代码拦截在Chrome for iOS上起作用。请参阅此测试演示。这也将证明这些重复呼叫是如何发生的。本质上,拦截代码应该忽略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();
(功能(打开){
XMLHttpRequest.prototype.open=函数(方法、url、异步、用户、传递){
var d1=document.getElementById('URL');
//避免在iOS本地安全检查URL上拦截Chrome
if(url.indexOf(“/chromecheckurl”)<0&&url.indexOf(“/chrome”)!=0){
//这些是我们想要拦截的
d1.insertAdjacentHTML('beforeend',''+url+'
'); }否则{ //这些是内部Chrome请求-我们可以忽略它们 d1.insertAdjacentHTML('beforeend',''+url+'
'); } open.apply(这个,参数); }; })(XMLHttpRequest.prototype.open); xmlhttp=新的XMLHttpRequest(); open(“GET”http://google.com“,对); xmlhttp.send();

这是我对Chrome for iOS上“重复的
open()
调用”错误的最好解释,也是一个解决方法。

XMLHttpRequest.prototype.open=function(){alert(“moo”);open.apply(这是参数);}
上会发生什么
call
不将操作上下文作为第一个参数,它将其视为第一个函数参数<但是,code>appy。据我所知,唯一的区别在于其余参数。但是,无论如何,我试图使用
apply
编辑它,但我得到了相同的错误。平心而论,我试图完全删除这一行,但我仍然遇到同样的问题:似乎编辑
XMLHttpRequests的
prototype
就可以做到这一点。啊,这一点很好。不过,其他IOS浏览器还能工作吗?因为IOS上的所有浏览器本质上都是位于同一渲染引擎之上的“可用性界面”。还有,它是IOS的特定版本吗?是的,我试过其他IOS浏览器,比如Mercury和Opera Mini。我听说用于iOS的Chrome浏览器有很多古怪之处,远远超出了你从网络视图中所期望的正常功能。我的iOS版本是8.2,但我试过用朋友的iPhone在iOS 7上运行。Chrome的最新版本为:41.0.2272.58。您的JSBin似乎没有调用open函数。你能确认一下你是否有这个问题吗?如果是这样,您是否也有问题?@NinGenShinRa请验证此演示在Chrome for IOS上是否适用谢谢您的回答,但这不是问题所在:JSFIDLE可能会做一些事情来避免无限警报循环,但是,上面的问题显示了。我很好奇,为什么你认为这会解决问题呢?当然,范围界定是很好的(不管怎样,我在我的原始代码中就是这么做的),但是这种帮助背后的原理是什么?(这样问也许我将来可以避免类似的陷阱)哦,有趣!让我调查一下。在我详细解释我怀疑的问题之前,我想让你确认它是否有效。也许我可以收回那张选票;)这确实是正确的答案。您链接的文件确实是在这个问题之后提交的,并使用我的JSBin作为一个最小的示例。谢谢你的研究!