JavaScript的执行console.log导致错误:“在主线程同步的XMLHttpRequest已经过时......”

问题描述 投票:353回答:21

我一直在增加日志到控制台检查不同变量的状态,而无需使用Firefox的调试器。

然而,在我在console.log文件中添加main.js很多地方,我收到以下错误,而不是我的可爱的小手写的讯息给自己:

在主线程同步的XMLHttpRequest是因为其所带来的影响最终用户的体验弃用。如需更多帮助http://xhr.spec.whatwg.org/

我可以添加console.log什么替代品或包装到我的代码使用不会导致这个错误?

我在“做错了”?

jquery debugging firefox backbone.js console.log
21个回答
269
投票

这发生在我身上时,我是懒惰和包含一个脚本标记,正在返回的内容的一部分。因此:

部分HTML内容:

<div> 
 SOME CONTENT HERE
</div>
<script src="/scripts/script.js"></script> 

看来,至少在我的情况下,如果返回通过XHR HTML内容那样,会给你带来jQuery来拨打电话,以获得该脚本。这调用发生与异步标志为假,因为它假定您需要的脚本来继续加载。

在这样的一个你会通过寻找到某种形式的约束框架,只是返回一个JSON对象,或者根据您的后端和模板,你可以改变你的加载脚本得到更好的服务情况。

你也可以使用jQuery's getScript()抢相关的脚本。这里是一个小提琴,这只是jQuery的例子的直副本,但我没有看到当脚本加载这样的警告抛出。

<script>
var url = "/scripts/script.js";
$.getScript(url);
</script>

http://jsfiddle.net/49tkL0qd/


5
投票

我得到这个例外,当我像“example.com/files/text.txt”查询设置网址。香港专业教育学院改变了网址为“http://example.com/files/text.txt”和这个异常dissapeared。


5
投票

而我得到这个例外,包括内部另一个can.js脚本,例如,

{{>anotherScript}}

5
投票

在MVC应用程序,我是因为我开剑道窗口与已返回查看(方法),而不是PartialView()得到这个警告。该视图()试图再次retrive页面的所有脚本。


5
投票

这是发生在我ZF2。我试图加载模态的内容,但我忘了之前禁用布局。

所以:

$viewModel = new ViewModel();
$viewModel->setTerminal(true);
return $viewModel;

5
投票

像@Nycen我也有,因为链接到Cloudfare的这个错误。煤矿是为选择二插件。

修复它我只是删除

 src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.min.js"

和错误走了。


5
投票

这是在我的案件告破。

JS

$.ajaxPrefilter(function( options, original_Options, jqXHR ) {
    options.async = true;
});

这个答案是插在这个环节

https://stackoverflow.com/questions/28322636/synchronous-xmlhttprequest-warning-and-script


4
投票

在我的情况下,这是由flexie脚本是由CloudFlare的提供的“CDNJS选择”应用程序的一部分引起的。

据CloudFlare的“这个程序即将淘汰2015年3月”。我把它关掉,该消息瞬间消失。

您可以通过访问https://www.cloudflare.com/a/cloudflare-apps/yourdomain.com访问应用程序

注:这是我的回答对这个线程Synchronous XMLHttpRequest warning and <script>复印件(我访问了寻找一个解决方案时)


4
投票
  1. 在Chrome中,press F12
  2. Develomping工具 - >按F1
  3. 请参阅设置>通用>外观:qazxsw poi-设置此复选框。
  4. 请参阅设置>通用>控制台:"Don't show chrome Data Saver warning" - 将此复选框了。

请享用


3
投票

我解决了这个问题通过下面的步骤:

  1. 检查您的CDN的脚本,并添加本地。
  2. 将您的脚本包括到标题部分。

3
投票

在我的具体情况,我渲染Rails的部分不"Log XMLHTTPRequest"其重新呈现整个布局,包括所有在render layout: false标签中的脚本。添加<head>控制器动作解决了这一问题。


73
投票

该警告消息可以是由于与设置为false异步标志主线程内一个XMLHttpRequest请求。

https://xhr.spec.whatwg.org/#synchronous-flag

工人外同步XMLHttpRequest是在从网络平台被删除,因为它有不利的影响到最终用户的体验过程。 (这是一个长期的过程,需要许多年。)当JavaScript的全球环境是一个文档环境开发人员不得通过为异步false参数。我们强烈建议用户代理警告开发者工具等的使用,并且可以与在其发生时抛出一个异常InvalidAccessError试验。

未来的方向是只允许在工作线程的XMLHttpRequest。该消息意在表明此警告。


3
投票

对我来说,问题是,在一个确定的要求,我希望Ajax响应是一个很好的HTML格式的字符串,比如一个表,但在这种情况下,服务器中遇到的问题与请求,重定向到一个错误页面,因此,被回返回错误页面的HTML代码(其中有一个render layout: false标签的地方。我的控制台登录Ajax响应,这时候我意识到这不是我所期待的,然后继续做我的调试。


0
投票

这个问题在2014年提出的,它是2019,所以我想这是很好的寻找更好的选择。

你可以简单地在Javascript这为您提供更多的灵活性,使用<script API。

例如,看到这个代码

fetch

62
投票

我也面临着同样的问题,但可以通过将异步解决它:真的。我知道这是默认为true,但是当我把它写明确它的工作原理

$.ajax({
   async: true,   // this will solve the problem
   type: "POST",
   url: "/Page/Method",
   contentType: "application/json",
   data: JSON.stringify({ ParameterName: paramValue }),
});

31
投票

Visual Studio中二千零十七分之二千零十五​​的现场调试器注入包含旧版调用代码。


19
投票

有时候有必要阿贾克斯加载脚本,但延迟文件准备的脚本被加载后,直到。

jQuery的支持这与holdReady()功能。

实例:

$.holdReady(true);                              //set hold
function releaseHold() { $.holdReady(false); }  //callback to release hold
$.getScript('script.js', releaseHold);          //load script then release hold

实际的脚本加载是异步的(没有错误),但效果是同步的,如果你的JavaScript其余文件准备好后运行。

这种先进的功能通常被认为要加载额外的JavaScript动态脚本装载机如jQuery插件允许发生ready事件之前使用,即使DOM可能是准备好了。

文档: https://api.jquery.com/jquery.holdready


UPDATE January 7, 2019

JQMIGRATE

jQuery.holdReady()已过时

原因:jQuery.holdReady()方法已经由于对页面的整体性能的不利影响弃用。这种方法可以防止网页上的所有代码初始化为过长时间。

解决方案:重写网页,使其不要求所有的jQuery准备处理延迟。这可能来完成,例如,通过后期装入只需要延迟时,可以安全地运行代码。由于这种方法的复杂性,jQuery的迁移不会尝试,以填补功能。如果jQuery的的基本版本使用jQuery的迁移不再包含jQuery.holdReady()出现此警告后的代码很快就会失败。


15
投票

要避免此警告,不要使用:

async: false

在您的任何$阿贾克斯()调用。这是一个弃用的XMLHttpRequest的唯一特征。

默认值是

async: true

jQuery has deprecated synchronous XMLHTTPRequest


12
投票

@Webgr部分答案其实是帮我调试此警告@控制台日志,可惜答案带来这么多downvotes另一部分:(

总之,这里是我发现了什么是此警告在我的情况的原因:

  1. 使用Chrome浏览器>按F12带来DevTools
  2. 打开抽屉菜单(在Chrome右上角3个垂直点)
  3. 在控制台>查看日志XMLHttpRequest的选项
  4. 重新载入网页这是给你的错误,并观察在控制台日志中的每个Ajax请求会发生什么。

在我的情况下,另一个插件是加载每次Ajax调用后2个的.js库,这是绝对不需要也没有必要。禁用流氓插件删除从日志的警告。从这一点来说,你可以尝试解决自己的问题(例如限制脚本某些网页或事件的加载 - 这是太特殊了这里的答案),或联系第三方插件开发者来解决它。

希望这可以帮助别人。


8
投票

我一直在寻找的答案都令人印象深刻。我觉得他应该提供被给了他一个问题的代码。考虑下面的例子,如果你有一个脚本链接到jQuery的在page.php文件,然后你会得到通知。

$().ready(function () {
    $.ajax({url: "page.php",
        type: 'GET',
        success: function (result) {
        $("#page").html(result);
   }});
 });

6
投票

我得到了以下的情况下,这样的警告:

1)文件1包含<script type="text/javascript" src="/javascript/jquery-1.10.2.js"></script>。页面有输入字段。我进入输入领域的一些值,然后单击按钮。 Jquery的发送输入到外部PHP文件。

2)外部的PHP文件还包含jQuery和在外部PHP文件我还包括<script type="text/javascript" src="/javascript/jquery-1.10.2.js"></script>。因为如果我得到了警告。

从外部php文件和作品,未经警告删除<script type="text/javascript" src="/javascript/jquery-1.10.2.js"></script>

正如我上加载第一文件(文件1)了解,我加载jquery-1.10.2.js和作为页不重新加载(它使用jquery $.post将数据发送到外部PHP文件),则jquery-1.10.2.js继续存在。所以,没有必要再加载它。

© www.soinside.com 2019 - 2024. All rights reserved.