JavaScript console.log导致错误:"主线程上的同步XMLHttpRequest已弃用..."

Nat*_*ese 373 debugging firefox jquery backbone.js console.log

我一直在向控制台添加日志,以便在不使用Firefox调试器的情况下检查不同变量的状态.

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

主线程上的同步XMLHttpRequest因其对最终用户体验的不利影响而被弃用.如需更多帮助http://xhr.spec.whatwg.org/

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

我做错了吗?

kro*_*olk 271

当我懒惰并且包含脚本标记作为正在返回的内容的一部分时,这发生在我身上.因此:

部分HTML内容:

<div> 
 SOME CONTENT HERE
</div>
<script src="/scripts/script.js"></script> 
Run Code Online (Sandbox Code Playgroud)

至少在我的情况下,似乎如果你通过xhr返回HTML内容,你将导致jQuery调用来获取该脚本.该调用发生在async标志为false,因为它假定您需要脚本继续加载.

在这样的情况下,通过查看某种类型的绑定框架并返回一个JSON对象,或者根据您的后端和模板,您可以更好地改变加载脚本的方式.

您还可以使用jQuerygetScript()来获取相关脚本.这是一个小提琴,它只是jQuery示例的直接副本,但是当脚本以这种方式加载时,我没有看到任何警告.

<script>
var url = "/scripts/script.js";
$.getScript(url);
</script>
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/49tkL0qd/

  • 错误是因为OP正在某处使用同步XMLHttpRequests,我不认为因为jquery似乎没有使用它...但是当我尝试加载`<script>`时,这发生在我身上你在一个ajax异步调用的回调中说.我的ajax调用是异步的但是在回调中我做了`$('#object').html(data)`其中data是一段带有`<script>`的`html`,当执行这一行时,错误出现在`js console`.+1!谢谢`:))` (8认同)
  • 这是我的问题,也很可能是OP的问题 - OP请考虑将此标记为答案.这里较高的投票答案目前无助于解决这个问题的人,所以接受这个答案会对其他人有很大的帮助. (3认同)
  • 实际上,对于这个项目,我确实使用了JQuery。 (2认同)

Ped*_*Dan 75

警告消息可能是由主线程中的XMLHttpRequest请求引起的,异步标志设置为false.

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

工作人员之外的同步XMLHttpRequest正在从Web平台中删除,因为它对最终用户的体验有不利影响.(这是一个需要很多年的漫长过程.)当JavaScript全局环境是文档环境时,开发人员不得为async参数传递false.强烈建议用户代理在开发人员工具中警告这种用法,并尝试在发生时抛出InvalidAccessError异常.

未来的方向是仅允许工作线程中的XMLHttpRequests.该消息旨在警告该效果.

  • 否,由于主线程中的XMLHttpRequest请求将async标志设置为false,因此消息警告是**PRESUMABLY**.这很可能是Firefox中的一个错误(但它可能是一个jQuery特性/实现); 无论哪种方式,如何描述部分规范被认为是一个问题的答案,声称`console.log`正在发送这些警告? (6认同)
  • @Brett - 我回答的最后两句话解释了为什么我包含了我所做的规范部分。我将编辑我的答案以更准确。 (2认同)
  • 尽管如此,你在这个答案中陈述的一切都是正确的信息; 此外,它可能与可能的问题有关; 也就是说,提出此警告会影响调试器的行为和/或稳定性.因此,解决方法很可能是通过纠正其原因来防止警告升起. (2认同)

Irf*_*raf 62

我也面临同样的问题,但能够通过输入async来修复它:true.我知道它默认为true但是当我明确地写它时它会起作用

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

  • 即使将async设置为true,错误也是一样的 (20认同)
  • 在我的情况下,这不是原因...只删除async:false而不更改为true修复了 (2认同)
  • @Irfan 就我而言,它设置了sync: false 有帮助! (2认同)

Cha*_*lie 31

Visual Studio 2015/2017的实时调试器是注入包含已弃用调用的代码.

  • 我花了很长时间试图弄清楚为什么我会看到这个警告; 我想我会分享最合适的SO问题,以便其他人节省一些时间. (8认同)

Dem*_*ian 20

有时需要ajax加载脚本,但延迟文档就绪,直到加载脚本.

jQuery支持这个holdReady()功能.

用法示例:

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

实际的脚本加载是异步的(没有错误),但如果其余的JavaScript在文档就绪后运行,则效果是同步的.

这个高级功能通常由动态脚本加载器使用,它希望在允许就绪事件发生之前加载其他JavaScript(如jQuery插件),即使DOM可能已准备就绪.

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


更新2019年1月7日

来自JQMIGRATE:

不推荐使用jQuery.holdReady()

原因:jQuery.holdReady()方法因其对页面全局性能的不利影响而被弃用.此方法可以防止页面上的所有代码初始化延长的时间长度.

解决方案:重写页面,使其不需要延迟所有jQuery就绪处理程序.例如,这可以通过在运行安全时仅延迟加载需要延迟的代码来实现.由于此方法的复杂性,jQuery Migrate不会尝试填充该功能.如果与jQuery Migrate一起使用的jQuery的基础版本不再包含jQuery.holdReady()代码,则在出现此警告后不久将失败.


Son*_*u K 16

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

async: false
Run Code Online (Sandbox Code Playgroud)

在任何$ .ajax()调用中.这是不推荐使用的XMLHttpRequest的唯一功能.

默认是

async: true
Run Code Online (Sandbox Code Playgroud)

jQuery已弃用同步XMLHTTPRequest


dev*_*101 12

@Webgr部分答案实际上帮我调试了这个警告@ console log,羞辱那个答案的另一部分带来了这么多downvotes :(

无论如何,这是我如何在我的案例中找出这个警告的原因:

  1. 使用Chrome浏览器>点按F12即可启用DevTools
  2. 打开抽屉菜单(在右上角的Chrome 3垂直点中)
  3. 在" 控制台" >"检查日志XMLHttpRequests"选项下
  4. 重新加载导致错误的页面,并观察控制台日志中每个ajax请求发生的情况.

在我的情况下,另一个插件在每次ajax调用后加载2个.js库,这绝对不是必需的也不是必需的.禁用流氓插件会从日志中删除警告.从那时起,您可以尝试自己解决问题(例如,限制脚本加载到某些页面或事件 - 这对于答案来说太具体了)或联系第三方插件开发人员来解决它.

希望这有助于某人.


小智 8

我一直在寻找令人印象深刻的答案.我认为他应该提供给他一个问题的代码.鉴于下面的示例,如果您有一个脚本链接到page.php中的jquery,那么您会收到通知.

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


And*_*ris 6

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

1)包含的file1 <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>.因为如果我得到警告.

<script type="text/javascript" src="/javascript/jquery-1.10.2.js"></script>从外部php文件中删除并在没有警告的情况下工作.

据我所知,在加载第一个文件(file1)时,我加载jquery-1.10.2.js并且由于页面没有重新加载(它使用jquery将数据发送到外部php文件$.post),然后jquery-1.10.2.js继续存在.所以不必再次加载它.


Rad*_*ren 5

当我在“ example.com/files/text.txt”之类的查询中设置网址时,出现了此异常。我已经将网址更改为“ http://example.com/files/text.txt ”,并且此异常消失了。


Cha*_*iam 5

我因为在一个can.js脚本中包含另一个脚本而感到异常,例如,

{{>anotherScript}}
Run Code Online (Sandbox Code Playgroud)


Mis*_*isi 5

在MVC应用程序中,收到此警告,是因为我正在使用返回View()而不是PartialView()的方法打开Kendo窗口。View()试图再次检索该页面的所有脚本。


Ric*_*wer 5

ZF2中发生了这件事。我试图加载Modal内容,但之前忘记禁用布局。

所以:

$viewModel = new ViewModel();
$viewModel->setTerminal(true);
return $viewModel;
Run Code Online (Sandbox Code Playgroud)


Roc*_*ice 5

像@Nycen一样,由于指向Cloudfare的链接,我也遇到了此错误。我的是Select2插件。

修复它我刚刚删除

 src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.min.js"
Run Code Online (Sandbox Code Playgroud)

错误消失了。


小智 5

  1. 在 Chrome 中, press F12
  2. 开发工具-> 按F1
  3. 请参阅设置"Don't show chrome Data Saver warning"- >常规- >外观:-设置此复选框。
  4. 请参阅设置->常规->控制台:"Log XMLHTTPRequest"-也设置此复选框。

享受


Bag*_*yan 5

就我而言,这已解决。

JS

$.ajaxPrefilter(function( options, original_Options, jqXHR ) {
    options.async = true;
});
Run Code Online (Sandbox Code Playgroud)

此答案已插入此链接

/sf/ask/1982584551/