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

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

主线程上的同步XMLHttpRequest已弃用,因为它会对最终用户的体验产生不利影响。更多帮助http://xhr.spec.whatwg.org/

我可以在我的代码使用中添加哪些不会导致此错误的console.log替代品或包装器?

我“做错了”吗?


当前回答

我发现这些问题导致早期重定向页面之前javascript完成,在我的情况下,firebase rtdb设置功能。

其他回答

这个问题在我的案例中得到了解决。

JS

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

这个答案被插入到这个链接中

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

像@Nycen一样,我也得到了这个错误,因为一个链接到Cloudfare。我的是Select2插件。

我刚把它拆了

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

错误消失了。

这种情况发生在我很懒的时候,我将脚本标记作为返回内容的一部分。是这样的:

部分HTML内容:

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

至少在我的例子中,如果通过xhr返回这样的HTML内容,就会导致jQuery调用该脚本。该调用带有一个async标志false,因为它假定您需要继续加载脚本。

在这种情况下,最好查看某种类型的绑定框架并返回一个JSON对象,或者根据后端和模板更改加载脚本的方式。

你也可以使用jQuery的getScript()来获取相关的脚本。这是一个小提琴,这只是一个直接复制的jQuery示例,但我没有看到任何警告抛出时,脚本加载的方式。

例子

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

http://jsfiddle.net/49tkL0qd/

有时候ajax加载一个脚本是必要的,但是延迟文档准备直到脚本加载之后。

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插件 在允许就绪事件发生之前,即使DOM可能发生 准备好了。

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


2019年1月7日更新

从JQMIGRATE:

jQuery.holdReady() is deprecated Cause: The jQuery.holdReady() method has been deprecated due to its detrimental effect on the global performance of the page. This method can prevent all the code on the page from initializing for extended lengths of time. Solution: Rewrite the page so that it does not require all jQuery ready handlers to be delayed. This might be accomplished, for example, by late-loading only the code that requires the delay when it is safe to run. Due to the complexity of this method, jQuery Migrate does not attempt to fill the functionality. If the underlying version of jQuery used with jQuery Migrate no longer contains jQuery.holdReady() the code will fail shortly after this warning appears.

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